001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.jet.codegen.state;
018
019 import com.intellij.openapi.project.Project;
020 import org.jetbrains.annotations.NotNull;
021 import org.jetbrains.jet.codegen.*;
022 import org.jetbrains.jet.codegen.binding.CodegenBinding;
023 import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods;
024 import org.jetbrains.jet.di.InjectorForJvmCodegen;
025 import org.jetbrains.jet.lang.psi.JetFile;
026 import org.jetbrains.jet.lang.resolve.BindingContext;
027 import org.jetbrains.jet.lang.resolve.BindingTrace;
028 import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
029
030 import java.util.List;
031
032 public class GenerationState {
033 private boolean used = false;
034
035 @NotNull
036 private final Progress progress;
037
038 @NotNull
039 private final List<JetFile> files;
040
041 @NotNull
042 private final ClassBuilderMode classBuilderMode;
043
044 @NotNull
045 private final BindingContext bindingContext;
046
047 @NotNull
048 private final ClassFileFactory classFileFactory;
049
050 @NotNull
051 private final ScriptCodegen scriptCodegen;
052
053 @NotNull
054 private final Project project;
055
056 @NotNull
057 private final IntrinsicMethods intrinsics;
058
059 @NotNull
060 private final SamWrapperClasses samWrapperClasses = new SamWrapperClasses(this);
061
062 @NotNull
063 private final BindingTrace bindingTrace;
064
065 @NotNull
066 private final JetTypeMapper typeMapper;
067
068 private final boolean generateNotNullAssertions;
069
070 private final boolean generateNotNullParamAssertions;
071
072 private final boolean generateDeclaredClasses;
073
074 public GenerationState(Project project, ClassBuilderFactory builderFactory, BindingContext bindingContext, List<JetFile> files) {
075 this(project, builderFactory, Progress.DEAF, bindingContext, files, BuiltinToJavaTypesMapping.ENABLED, true, false, true);
076 }
077
078 public GenerationState(
079 @NotNull Project project,
080 @NotNull ClassBuilderFactory builderFactory,
081 @NotNull Progress progress,
082 @NotNull BindingContext bindingContext,
083 @NotNull List<JetFile> files,
084 @NotNull BuiltinToJavaTypesMapping builtinToJavaTypesMapping,
085 boolean generateNotNullAssertions,
086 boolean generateNotNullParamAssertions,
087 boolean generateDeclaredClasses
088 ) {
089 this.project = project;
090 this.progress = progress;
091 this.files = files;
092 this.classBuilderMode = builderFactory.getClassBuilderMode();
093
094 bindingTrace = new DelegatingBindingTrace(bindingContext, "trace in GenerationState");
095 this.bindingContext = bindingTrace.getBindingContext();
096
097 this.typeMapper = new JetTypeMapper(bindingTrace, builtinToJavaTypesMapping == BuiltinToJavaTypesMapping.ENABLED, classBuilderMode);
098
099 InjectorForJvmCodegen injector = new InjectorForJvmCodegen(typeMapper, this, builderFactory, project);
100
101 this.scriptCodegen = injector.getScriptCodegen();
102 this.intrinsics = injector.getIntrinsics();
103 this.classFileFactory = injector.getClassFileFactory();
104
105 this.generateNotNullAssertions = generateNotNullAssertions;
106 this.generateNotNullParamAssertions = generateNotNullParamAssertions;
107 this.generateDeclaredClasses = generateDeclaredClasses;
108 }
109
110 @NotNull
111 public ClassFileFactory getFactory() {
112 return classFileFactory;
113 }
114
115 @NotNull
116 public Progress getProgress() {
117 return progress;
118 }
119
120 @NotNull
121 public BindingContext getBindingContext() {
122 return bindingContext;
123 }
124
125 @NotNull
126 public ClassBuilderMode getClassBuilderMode() {
127 return classBuilderMode;
128 }
129
130 @NotNull
131 public List<JetFile> getFiles() {
132 return files;
133 }
134
135 @NotNull
136 public ScriptCodegen getScriptCodegen() {
137 return scriptCodegen;
138 }
139
140 @NotNull
141 public BindingTrace getBindingTrace() {
142 return bindingTrace;
143 }
144
145 @NotNull
146 public JetTypeMapper getTypeMapper() {
147 return typeMapper;
148 }
149
150 @NotNull
151 public Project getProject() {
152 return project;
153 }
154
155 @NotNull
156 public IntrinsicMethods getIntrinsics() {
157 return intrinsics;
158 }
159
160 @NotNull
161 public SamWrapperClasses getSamWrapperClasses() {
162 return samWrapperClasses;
163 }
164
165 public boolean isGenerateNotNullAssertions() {
166 return generateNotNullAssertions;
167 }
168
169 public boolean isGenerateNotNullParamAssertions() {
170 return generateNotNullParamAssertions;
171 }
172
173 public boolean isGenerateDeclaredClasses() {
174 return generateDeclaredClasses;
175 }
176
177 public void beforeCompile() {
178 markUsed();
179
180 //noinspection unchecked
181 CodegenBinding.initTrace(getBindingTrace(), getFiles());
182 }
183
184 private void markUsed() {
185 if (used) {
186 throw new IllegalStateException(GenerationState.class + " cannot be used more than once");
187 }
188 used = true;
189 }
190
191 public void destroy() {
192 }
193 }