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    }