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 @Nullable
074 private List<ScriptDescriptor> earlierScriptsForReplInterpreter;
075
076 public GenerationState(Project project, ClassBuilderFactory builderFactory, BindingContext bindingContext, List<JetFile> files) {
077 this(project, builderFactory, Progress.DEAF, bindingContext, files, true, false, true);
078 }
079
080 public GenerationState(
081 @NotNull Project project,
082 @NotNull ClassBuilderFactory builderFactory,
083 @NotNull Progress progress,
084 @NotNull BindingContext bindingContext,
085 @NotNull List<JetFile> files,
086 boolean generateNotNullAssertions,
087 boolean generateNotNullParamAssertions,
088 boolean generateDeclaredClasses
089 ) {
090 this.project = project;
091 this.progress = progress;
092 this.files = files;
093 this.classBuilderMode = builderFactory.getClassBuilderMode();
094
095 bindingTrace = new DelegatingBindingTrace(bindingContext, "trace in GenerationState");
096 this.bindingContext = bindingTrace.getBindingContext();
097
098 this.typeMapper = new JetTypeMapper(bindingTrace, classBuilderMode);
099
100 InjectorForJvmCodegen injector = new InjectorForJvmCodegen(typeMapper, this, builderFactory, project);
101
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 BindingTrace getBindingTrace() {
137 return bindingTrace;
138 }
139
140 @NotNull
141 public JetTypeMapper getTypeMapper() {
142 return typeMapper;
143 }
144
145 @NotNull
146 public Project getProject() {
147 return project;
148 }
149
150 @NotNull
151 public IntrinsicMethods getIntrinsics() {
152 return intrinsics;
153 }
154
155 @NotNull
156 public SamWrapperClasses getSamWrapperClasses() {
157 return samWrapperClasses;
158 }
159
160 public boolean isGenerateNotNullAssertions() {
161 return generateNotNullAssertions;
162 }
163
164 public boolean isGenerateNotNullParamAssertions() {
165 return generateNotNullParamAssertions;
166 }
167
168 public boolean isGenerateDeclaredClasses() {
169 return generateDeclaredClasses;
170 }
171
172 public void beforeCompile() {
173 markUsed();
174
175 //noinspection unchecked
176 CodegenBinding.initTrace(getBindingTrace(), getFiles());
177 }
178
179 private void markUsed() {
180 if (used) {
181 throw new IllegalStateException(GenerationState.class + " cannot be used more than once");
182 }
183 used = true;
184 }
185
186 public void destroy() {
187 }
188
189 @Nullable
190 public List<ScriptDescriptor> getEarlierScriptsForReplInterpreter() {
191 return earlierScriptsForReplInterpreter;
192 }
193
194 public void setEarlierScriptsForReplInterpreter(@Nullable List<ScriptDescriptor> earlierScriptsForReplInterpreter) {
195 this.earlierScriptsForReplInterpreter = earlierScriptsForReplInterpreter;
196 }
197 }