001 /* 002 * Copyright 2010-2014 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.inline.InlineCodegenUtil; 025 import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods; 026 import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; 027 import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; 028 import org.jetbrains.jet.lang.diagnostics.DiagnosticHolder; 029 import org.jetbrains.jet.lang.psi.JetClassOrObject; 030 import org.jetbrains.jet.lang.psi.JetFile; 031 import org.jetbrains.jet.lang.reflect.ReflectionTypes; 032 import org.jetbrains.jet.lang.resolve.BindingContext; 033 import org.jetbrains.jet.lang.resolve.BindingTrace; 034 import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace; 035 import org.jetbrains.jet.lang.resolve.name.FqName; 036 037 import java.util.Collection; 038 import java.util.Collections; 039 import java.util.List; 040 041 public class GenerationState { 042 public interface GenerateClassFilter { 043 boolean shouldProcess(JetClassOrObject classOrObject); 044 045 GenerateClassFilter GENERATE_ALL = new GenerateClassFilter() { 046 @Override 047 public boolean shouldProcess(JetClassOrObject classOrObject) { 048 return true; 049 } 050 }; 051 } 052 053 private boolean used = false; 054 055 @NotNull 056 private final Progress progress; 057 058 @NotNull 059 private final List<JetFile> files; 060 061 @NotNull 062 private final ClassBuilderMode classBuilderMode; 063 064 @NotNull 065 private final BindingContext bindingContext; 066 067 @NotNull 068 private final ClassFileFactory classFileFactory; 069 070 @NotNull 071 private final Project project; 072 073 @NotNull 074 private final IntrinsicMethods intrinsics; 075 076 @NotNull 077 private final SamWrapperClasses samWrapperClasses = new SamWrapperClasses(this); 078 079 @NotNull 080 private final BindingTrace bindingTrace; 081 082 @NotNull 083 private final JetTypeMapper typeMapper; 084 085 private final boolean generateNotNullAssertions; 086 087 private final boolean generateNotNullParamAssertions; 088 089 private final GenerateClassFilter generateClassFilter; 090 091 private final boolean inlineEnabled; 092 093 @Nullable 094 private List<ScriptDescriptor> earlierScriptsForReplInterpreter; 095 096 private final JvmRuntimeTypes runtimeTypes; 097 098 @NotNull 099 private final ModuleDescriptor module; 100 101 @NotNull 102 private final Collection<FqName> packagesWithRemovedFiles; 103 104 @Nullable 105 private final String moduleId; // for PackageCodegen in incremental compilation mode 106 107 public GenerationState( 108 @NotNull Project project, 109 @NotNull ClassBuilderFactory builderFactory, 110 @NotNull ModuleDescriptor module, 111 @NotNull BindingContext bindingContext, 112 @NotNull List<JetFile> files 113 ) { 114 this(project, builderFactory, Progress.DEAF, module, bindingContext, files, true, false, GenerateClassFilter.GENERATE_ALL, 115 InlineCodegenUtil.DEFAULT_INLINE_FLAG, null, null, DiagnosticHolder.DO_NOTHING); 116 } 117 118 public GenerationState( 119 @NotNull Project project, 120 @NotNull ClassBuilderFactory builderFactory, 121 @NotNull Progress progress, 122 @NotNull ModuleDescriptor module, 123 @NotNull BindingContext bindingContext, 124 @NotNull List<JetFile> files, 125 boolean generateNotNullAssertions, 126 boolean generateNotNullParamAssertions, 127 GenerateClassFilter generateClassFilter, 128 boolean inlineEnabled, 129 @Nullable Collection<FqName> packagesWithRemovedFiles, 130 @Nullable String moduleId, 131 @NotNull DiagnosticHolder diagnostics 132 ) { 133 this.project = project; 134 this.progress = progress; 135 this.module = module; 136 this.files = files; 137 this.moduleId = moduleId; 138 this.packagesWithRemovedFiles = packagesWithRemovedFiles == null ? Collections.<FqName>emptySet() : packagesWithRemovedFiles; 139 this.classBuilderMode = builderFactory.getClassBuilderMode(); 140 this.inlineEnabled = inlineEnabled; 141 142 this.bindingTrace = new DelegatingBindingTrace(bindingContext, "trace in GenerationState"); 143 this.bindingContext = bindingTrace.getBindingContext(); 144 145 this.typeMapper = new JetTypeMapper(this.bindingContext, classBuilderMode); 146 147 this.intrinsics = new IntrinsicMethods(); 148 this.classFileFactory = new ClassFileFactory(this, new BuilderFactoryForDuplicateSignatureDiagnostics( 149 builderFactory, this.bindingContext, diagnostics)); 150 151 this.generateNotNullAssertions = generateNotNullAssertions; 152 this.generateNotNullParamAssertions = generateNotNullParamAssertions; 153 this.generateClassFilter = generateClassFilter; 154 155 ReflectionTypes reflectionTypes = new ReflectionTypes(module); 156 this.runtimeTypes = new JvmRuntimeTypes(reflectionTypes); 157 } 158 159 @NotNull 160 public ClassFileFactory getFactory() { 161 return classFileFactory; 162 } 163 164 @NotNull 165 public Progress getProgress() { 166 return progress; 167 } 168 169 @NotNull 170 public BindingContext getBindingContext() { 171 return bindingContext; 172 } 173 174 @NotNull 175 public ClassBuilderMode getClassBuilderMode() { 176 return classBuilderMode; 177 } 178 179 @NotNull 180 public List<JetFile> getFiles() { 181 return files; 182 } 183 184 @NotNull 185 public BindingTrace getBindingTrace() { 186 return bindingTrace; 187 } 188 189 @NotNull 190 public JetTypeMapper getTypeMapper() { 191 return typeMapper; 192 } 193 194 @NotNull 195 public Project getProject() { 196 return project; 197 } 198 199 @NotNull 200 public IntrinsicMethods getIntrinsics() { 201 return intrinsics; 202 } 203 204 @NotNull 205 public SamWrapperClasses getSamWrapperClasses() { 206 return samWrapperClasses; 207 } 208 209 public boolean isGenerateNotNullAssertions() { 210 return generateNotNullAssertions; 211 } 212 213 public boolean isGenerateNotNullParamAssertions() { 214 return generateNotNullParamAssertions; 215 } 216 217 @NotNull 218 public GenerateClassFilter getGenerateDeclaredClassFilter() { 219 return generateClassFilter; 220 } 221 222 @NotNull 223 public JvmRuntimeTypes getJvmRuntimeTypes() { 224 return runtimeTypes; 225 } 226 227 public boolean isInlineEnabled() { 228 return inlineEnabled; 229 } 230 231 public void beforeCompile() { 232 markUsed(); 233 234 CodegenBinding.initTrace(this); 235 } 236 237 private void markUsed() { 238 if (used) { 239 throw new IllegalStateException(GenerationState.class + " cannot be used more than once"); 240 } 241 used = true; 242 } 243 244 public void destroy() { 245 } 246 247 @Nullable 248 public List<ScriptDescriptor> getEarlierScriptsForReplInterpreter() { 249 return earlierScriptsForReplInterpreter; 250 } 251 252 public void setEarlierScriptsForReplInterpreter(@Nullable List<ScriptDescriptor> earlierScriptsForReplInterpreter) { 253 this.earlierScriptsForReplInterpreter = earlierScriptsForReplInterpreter; 254 } 255 256 @NotNull 257 public ModuleDescriptor getModule() { 258 return module; 259 } 260 261 @NotNull 262 public Collection<FqName> getPackagesWithRemovedFiles() { 263 return packagesWithRemovedFiles; 264 } 265 266 @Nullable 267 public String getModuleId() { 268 return moduleId; 269 } 270 }