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.annotations.Nullable;
022 import org.jetbrains.jet.codegen.*;
023 import org.jetbrains.jet.codegen.binding.CodegenBinding;
024 import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods;
025 import org.jetbrains.jet.di.InjectorForJvmCodegen;
026 import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
027 import org.jetbrains.jet.lang.psi.JetFile;
028 import org.jetbrains.jet.lang.resolve.BindingContext;
029 import org.jetbrains.jet.lang.resolve.BindingTrace;
030 import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
031
032 import java.util.List;
033
034 public class GenerationState {
035 private boolean used = false;
036
037 @NotNull
038 private final Progress progress;
039
040 @NotNull
041 private final List<JetFile> files;
042
043 @NotNull
044 private final ClassBuilderMode classBuilderMode;
045
046 @NotNull
047 private final BindingContext bindingContext;
048
049 @NotNull
050 private final ClassFileFactory classFileFactory;
051
052 @NotNull
053 private final Project project;
054
055 @NotNull
056 private final IntrinsicMethods intrinsics;
057
058 @NotNull
059 private final SamWrapperClasses samWrapperClasses = new SamWrapperClasses(this);
060
061 @NotNull
062 private final BindingTrace bindingTrace;
063
064 @NotNull
065 private final JetTypeMapper typeMapper;
066
067 private final boolean generateNotNullAssertions;
068
069 private final boolean generateNotNullParamAssertions;
070
071 private final boolean generateDeclaredClasses;
072
073 private final boolean inlineEnabled;
074
075 @Nullable
076 private List<ScriptDescriptor> earlierScriptsForReplInterpreter;
077
078 public GenerationState(Project project, ClassBuilderFactory builderFactory, BindingContext bindingContext, List<JetFile> files, boolean inlineEnabled) {
079 this(project, builderFactory, Progress.DEAF, bindingContext, files, true, false, true, inlineEnabled);
080 }
081
082 public GenerationState(
083 @NotNull Project project,
084 @NotNull ClassBuilderFactory builderFactory,
085 @NotNull Progress progress,
086 @NotNull BindingContext bindingContext,
087 @NotNull List<JetFile> files,
088 boolean generateNotNullAssertions,
089 boolean generateNotNullParamAssertions,
090 boolean generateDeclaredClasses,
091 boolean inlineEnabled
092 ) {
093 this.project = project;
094 this.progress = progress;
095 this.files = files;
096 this.classBuilderMode = builderFactory.getClassBuilderMode();
097 this.inlineEnabled = inlineEnabled;
098
099 bindingTrace = new DelegatingBindingTrace(bindingContext, "trace in GenerationState");
100 this.bindingContext = bindingTrace.getBindingContext();
101
102 this.typeMapper = new JetTypeMapper(bindingTrace, classBuilderMode);
103
104 InjectorForJvmCodegen injector = new InjectorForJvmCodegen(typeMapper, this, builderFactory, project);
105
106 this.intrinsics = injector.getIntrinsics();
107 this.classFileFactory = injector.getClassFileFactory();
108
109 this.generateNotNullAssertions = generateNotNullAssertions;
110 this.generateNotNullParamAssertions = generateNotNullParamAssertions;
111 this.generateDeclaredClasses = generateDeclaredClasses;
112 }
113
114 @NotNull
115 public ClassFileFactory getFactory() {
116 return classFileFactory;
117 }
118
119 @NotNull
120 public Progress getProgress() {
121 return progress;
122 }
123
124 @NotNull
125 public BindingContext getBindingContext() {
126 return bindingContext;
127 }
128
129 @NotNull
130 public ClassBuilderMode getClassBuilderMode() {
131 return classBuilderMode;
132 }
133
134 @NotNull
135 public List<JetFile> getFiles() {
136 return files;
137 }
138
139 @NotNull
140 public BindingTrace getBindingTrace() {
141 return bindingTrace;
142 }
143
144 @NotNull
145 public JetTypeMapper getTypeMapper() {
146 return typeMapper;
147 }
148
149 @NotNull
150 public Project getProject() {
151 return project;
152 }
153
154 @NotNull
155 public IntrinsicMethods getIntrinsics() {
156 return intrinsics;
157 }
158
159 @NotNull
160 public SamWrapperClasses getSamWrapperClasses() {
161 return samWrapperClasses;
162 }
163
164 public boolean isGenerateNotNullAssertions() {
165 return generateNotNullAssertions;
166 }
167
168 public boolean isGenerateNotNullParamAssertions() {
169 return generateNotNullParamAssertions;
170 }
171
172 public boolean isGenerateDeclaredClasses() {
173 return generateDeclaredClasses;
174 }
175
176 public boolean isInlineEnabled() {
177 return inlineEnabled;
178 }
179
180 public void beforeCompile() {
181 markUsed();
182
183 //noinspection unchecked
184 CodegenBinding.initTrace(getBindingTrace(), getFiles());
185 }
186
187 private void markUsed() {
188 if (used) {
189 throw new IllegalStateException(GenerationState.class + " cannot be used more than once");
190 }
191 used = true;
192 }
193
194 public void destroy() {
195 }
196
197 @Nullable
198 public List<ScriptDescriptor> getEarlierScriptsForReplInterpreter() {
199 return earlierScriptsForReplInterpreter;
200 }
201
202 public void setEarlierScriptsForReplInterpreter(@Nullable List<ScriptDescriptor> earlierScriptsForReplInterpreter) {
203 this.earlierScriptsForReplInterpreter = earlierScriptsForReplInterpreter;
204 }
205 }