Got rid of "namespace" word in backend.

This commit is contained in:
Evgeny Gerashchenko
2014-01-10 00:38:19 +04:00
parent 1f74f02344
commit 4239f5bb18
23 changed files with 93 additions and 96 deletions
@@ -44,7 +44,7 @@ import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageCl
public final class ClassFileFactory extends GenerationStateAware implements OutputFileCollection { public final class ClassFileFactory extends GenerationStateAware implements OutputFileCollection {
@NotNull private ClassBuilderFactory builderFactory; @NotNull private ClassBuilderFactory builderFactory;
private final Map<FqName, NamespaceCodegen> ns2codegen = new HashMap<FqName, NamespaceCodegen>(); private final Map<FqName, PackageCodegen> package2codegen = new HashMap<FqName, PackageCodegen>();
private final Map<String, ClassBuilderAndSourceFileList> generators = new LinkedHashMap<String, ClassBuilderAndSourceFileList>(); private final Map<String, ClassBuilderAndSourceFileList> generators = new LinkedHashMap<String, ClassBuilderAndSourceFileList>();
private boolean isDone = false; private boolean isDone = false;
@@ -74,7 +74,7 @@ public final class ClassFileFactory extends GenerationStateAware implements Outp
private void done() { private void done() {
if (!isDone) { if (!isDone) {
isDone = true; isDone = true;
for (NamespaceCodegen codegen : ns2codegen.values()) { for (PackageCodegen codegen : package2codegen.values()) {
codegen.done(); codegen.done();
} }
} }
@@ -110,9 +110,9 @@ public final class ClassFileFactory extends GenerationStateAware implements Outp
return answer.toString(); return answer.toString();
} }
public NamespaceCodegen forNamespace(final FqName fqName, final Collection<JetFile> files) { public PackageCodegen forPackage(final FqName fqName, final Collection<JetFile> files) {
assert !isDone : "Already done!"; assert !isDone : "Already done!";
NamespaceCodegen codegen = ns2codegen.get(fqName); PackageCodegen codegen = package2codegen.get(fqName);
if (codegen == null) { if (codegen == null) {
ClassBuilderOnDemand onDemand = new ClassBuilderOnDemand() { ClassBuilderOnDemand onDemand = new ClassBuilderOnDemand() {
@NotNull @NotNull
@@ -121,8 +121,8 @@ public final class ClassFileFactory extends GenerationStateAware implements Outp
return newVisitor(asmTypeByFqNameWithoutInnerClasses(getPackageClassFqName(fqName)), files); return newVisitor(asmTypeByFqNameWithoutInnerClasses(getPackageClassFqName(fqName)), files);
} }
}; };
codegen = new NamespaceCodegen(onDemand, fqName, state, files); codegen = new PackageCodegen(onDemand, fqName, state, files);
ns2codegen.put(fqName, codegen); package2codegen.put(fqName, codegen);
} }
return codegen; return codegen;
@@ -246,7 +246,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
else { else {
assert isObjectLiteral assert isObjectLiteral
: "Function descriptor could be null only for object literal in package namespace: " + descriptor.getName(); : "Function descriptor could be null only for object literal in package: " + descriptor.getName();
v.visitOuterClass(outerClassName, null, null); v.visitOuterClass(outerClassName, null, null);
} }
} }
@@ -261,7 +261,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
JetFile containingFile = BindingContextUtils.getContainingFile(typeMapper.getBindingContext(), classDescriptor); JetFile containingFile = BindingContextUtils.getContainingFile(typeMapper.getBindingContext(), classDescriptor);
assert containingFile != null : "Containing file should be present for " + classDescriptor; assert containingFile != null : "Containing file should be present for " + classDescriptor;
return NamespaceCodegen.getNamespacePartInternalName(containingFile); return PackageCodegen.getPackagePartInternalName(containingFile);
} }
private void writeInnerClasses() { private void writeInnerClasses() {
@@ -16,12 +16,10 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import com.intellij.openapi.util.Pair;
import com.intellij.util.containers.MultiMap; import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.psi.JetScript; import org.jetbrains.jet.lang.psi.JetScript;
@@ -29,7 +27,6 @@ import org.jetbrains.jet.lang.resolve.ScriptNameUtil;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Map; import java.util.Map;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.registerClassNameForScript; import static org.jetbrains.jet.codegen.binding.CodegenBinding.registerClassNameForScript;
@@ -50,25 +47,25 @@ public class KotlinCodegenFacade {
state.beforeCompile(); state.beforeCompile();
MultiMap<FqName, JetFile> namespaceGrouping = new MultiMap<FqName, JetFile>(); MultiMap<FqName, JetFile> packageFqNameToFiles = new MultiMap<FqName, JetFile>();
for (JetFile file : state.getFiles()) { for (JetFile file : state.getFiles()) {
if (file == null) throw new IllegalArgumentException("A null file given for compilation"); if (file == null) throw new IllegalArgumentException("A null file given for compilation");
namespaceGrouping.putValue(JetPsiUtil.getFQName(file), file); packageFqNameToFiles.putValue(JetPsiUtil.getFQName(file), file);
} }
for (Map.Entry<FqName, Collection<JetFile>> entry : namespaceGrouping.entrySet()) { for (Map.Entry<FqName, Collection<JetFile>> entry : packageFqNameToFiles.entrySet()) {
generateNamespace(state, entry.getKey(), entry.getValue(), errorHandler); generatePackage(state, entry.getKey(), entry.getValue(), errorHandler);
} }
} }
public static void generateNamespace( public static void generatePackage(
@NotNull GenerationState state, @NotNull GenerationState state,
@NotNull FqName fqName, @NotNull FqName fqName,
@NotNull Collection<JetFile> jetFiles, @NotNull Collection<JetFile> jetFiles,
@NotNull CompilationErrorHandler errorHandler @NotNull CompilationErrorHandler errorHandler
) { ) {
NamespaceCodegen codegen = state.getFactory().forNamespace(fqName, jetFiles); PackageCodegen codegen = state.getFactory().forPackage(fqName, jetFiles);
codegen.generate(errorHandler); codegen.generate(errorHandler);
} }
private KotlinCodegenFacade() {} private KotlinCodegenFacade() {}
@@ -53,7 +53,7 @@ import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClass
import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver; import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver;
import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageClassFqName; import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageClassFqName;
public class NamespaceCodegen extends MemberCodegen { public class PackageCodegen extends MemberCodegen {
private final ClassBuilderOnDemand v; private final ClassBuilderOnDemand v;
@NotNull @NotNull
@@ -63,25 +63,25 @@ public class NamespaceCodegen extends MemberCodegen {
private final Collection<JetFile> files; private final Collection<JetFile> files;
private final Set<PackageFragmentDescriptor> packageFragments; private final Set<PackageFragmentDescriptor> packageFragments;
public NamespaceCodegen( public PackageCodegen(
@NotNull ClassBuilderOnDemand v, @NotNull ClassBuilderOnDemand v,
@NotNull final FqName fqName, @NotNull final FqName fqName,
@NotNull GenerationState state, @NotNull GenerationState state,
@NotNull Collection<JetFile> namespaceFiles @NotNull Collection<JetFile> packageFiles
) { ) {
super(state, null); super(state, null);
checkAllFilesHaveSameNamespace(namespaceFiles); checkAllFilesHaveSamePackage(packageFiles);
this.v = v; this.v = v;
name = fqName; name = fqName;
this.files = namespaceFiles; this.files = packageFiles;
packageFragments = Sets.newHashSet(); packageFragments = Sets.newHashSet();
for (JetFile file : namespaceFiles) { for (JetFile file : packageFiles) {
packageFragments.add(getPackageFragment(file)); packageFragments.add(getPackageFragment(file));
} }
final PsiFile sourceFile = namespaceFiles.size() == 1 ? namespaceFiles.iterator().next().getContainingFile() : null; final PsiFile sourceFile = packageFiles.size() == 1 ? packageFiles.iterator().next().getContainingFile() : null;
v.addOptionalDeclaration(new ClassBuilderOnDemand.ClassBuilderCallback() { v.addOptionalDeclaration(new ClassBuilderOnDemand.ClassBuilderCallback() {
@Override @Override
@@ -93,7 +93,7 @@ public class NamespaceCodegen extends MemberCodegen {
"java/lang/Object", "java/lang/Object",
ArrayUtil.EMPTY_STRING_ARRAY ArrayUtil.EMPTY_STRING_ARRAY
); );
//We don't generate any source information for namespace with multiple files //We don't generate any source information for package with multiple files
if (sourceFile != null) { if (sourceFile != null) {
v.visitSource(sourceFile.getName(), null); v.visitSource(sourceFile.getName(), null);
} }
@@ -103,7 +103,7 @@ public class NamespaceCodegen extends MemberCodegen {
public void generate(@NotNull CompilationErrorHandler errorHandler) { public void generate(@NotNull CompilationErrorHandler errorHandler) {
List<JvmSerializationBindings> bindings = new ArrayList<JvmSerializationBindings>(files.size() + 1); List<JvmSerializationBindings> bindings = new ArrayList<JvmSerializationBindings>(files.size() + 1);
boolean shouldGeneratePackageClass = shouldGenerateNSClass(files); boolean shouldGeneratePackageClass = shouldGeneratePackageClass(files);
if (shouldGeneratePackageClass) { if (shouldGeneratePackageClass) {
bindings.add(v.getClassBuilder().getSerializationBindings()); bindings.add(v.getClassBuilder().getSerializationBindings());
} }
@@ -134,7 +134,7 @@ public class NamespaceCodegen extends MemberCodegen {
} }
assert v.isActivated() == shouldGeneratePackageClass : assert v.isActivated() == shouldGeneratePackageClass :
"Different algorithms for generating namespace class and for heuristics for: " + name.asString(); "Different algorithms for generating package class and for heuristics for: " + name.asString();
} }
private void writeKotlinPackageAnnotationIfNeeded(@NotNull JvmSerializationBindings bindings) { private void writeKotlinPackageAnnotationIfNeeded(@NotNull JvmSerializationBindings bindings) {
@@ -185,16 +185,16 @@ public class NamespaceCodegen extends MemberCodegen {
if (!generateSrcClass) return null; if (!generateSrcClass) return null;
Type packagePartType = getNamespacePartType(getPackageClassFqName(name), file.getVirtualFile()); Type packagePartType = getPackagePartType(getPackageClassFqName(name), file.getVirtualFile());
ClassBuilder builder = state.getFactory().forPackageFragment(packagePartType, file); ClassBuilder builder = state.getFactory().forPackageFragment(packagePartType, file);
new NamespacePartCodegen(builder, file, packagePartType, packagePartContext, state).generate(); new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate();
FieldOwnerContext namespaceFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, getPackageFragment(file)); FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, getPackageFragment(file));
for (JetDeclaration declaration : file.getDeclarations()) { for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetNamedFunction || declaration instanceof JetProperty) { if (declaration instanceof JetNamedFunction || declaration instanceof JetProperty) {
genFunctionOrProperty(namespaceFacade, (JetTypeParameterListOwner) declaration, v.getClassBuilder()); genFunctionOrProperty(packageFacade, (JetTypeParameterListOwner) declaration, v.getClassBuilder());
} }
} }
@@ -214,13 +214,13 @@ public class NamespaceCodegen extends MemberCodegen {
} }
/** /**
* @param namespaceFiles all files should have same package name * @param packageFiles all files should have same package name
* @return * @return
*/ */
public static boolean shouldGenerateNSClass(@NotNull Collection<JetFile> namespaceFiles) { public static boolean shouldGeneratePackageClass(@NotNull Collection<JetFile> packageFiles) {
checkAllFilesHaveSameNamespace(namespaceFiles); checkAllFilesHaveSamePackage(packageFiles);
for (JetFile file : namespaceFiles) { for (JetFile file : packageFiles) {
for (JetDeclaration declaration : file.getDeclarations()) { for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
return true; return true;
@@ -231,9 +231,9 @@ public class NamespaceCodegen extends MemberCodegen {
return false; return false;
} }
private static void checkAllFilesHaveSameNamespace(Collection<JetFile> namespaceFiles) { private static void checkAllFilesHaveSamePackage(Collection<JetFile> packageFiles) {
FqName commonFqName = null; FqName commonFqName = null;
for (JetFile file : namespaceFiles) { for (JetFile file : packageFiles) {
FqName fqName = JetPsiUtil.getFQName(file); FqName fqName = JetPsiUtil.getFQName(file);
if (commonFqName != null) { if (commonFqName != null) {
if (!commonFqName.equals(fqName)) { if (!commonFqName.equals(fqName)) {
@@ -251,7 +251,7 @@ public class NamespaceCodegen extends MemberCodegen {
} }
@NotNull @NotNull
public static Type getNamespacePartType(@NotNull FqName facadeFqName, @NotNull VirtualFile file) { public static Type getPackagePartType(@NotNull FqName facadeFqName, @NotNull VirtualFile file) {
String fileName = FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.getName())); String fileName = FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.getName()));
// path hashCode to prevent same name / different path collision // path hashCode to prevent same name / different path collision
@@ -269,8 +269,8 @@ public class NamespaceCodegen extends MemberCodegen {
} }
@NotNull @NotNull
public static String getNamespacePartInternalName(@NotNull JetFile file) { public static String getPackagePartInternalName(@NotNull JetFile file) {
FqName packageFqName = JetPsiUtil.getFQName(file); FqName packageFqName = JetPsiUtil.getFQName(file);
return getNamespacePartType(getPackageClassFqName(packageFqName), file.getVirtualFile()).getInternalName(); return getPackagePartType(getPackageClassFqName(packageFqName), file.getVirtualFile()).getInternalName();
} }
} }
@@ -39,7 +39,7 @@ import java.util.List;
import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.asm4.Opcodes.*;
import static org.jetbrains.jet.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses; import static org.jetbrains.jet.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses;
public class NamespacePartCodegen extends MemberCodegen { public class PackagePartCodegen extends MemberCodegen {
private final ClassBuilder v; private final ClassBuilder v;
@@ -47,30 +47,30 @@ public class NamespacePartCodegen extends MemberCodegen {
private final JetFile jetFile; private final JetFile jetFile;
private final Type namespacePartName; private final Type packagePartName;
private final FieldOwnerContext context; private final FieldOwnerContext context;
public NamespacePartCodegen( public PackagePartCodegen(
@NotNull ClassBuilder v, @NotNull ClassBuilder v,
@NotNull JetFile jetFile, @NotNull JetFile jetFile,
@NotNull Type namespacePartName, @NotNull Type packagePartName,
@NotNull FieldOwnerContext context, @NotNull FieldOwnerContext context,
@NotNull GenerationState state @NotNull GenerationState state
) { ) {
super(state, null); super(state, null);
this.v = v; this.v = v;
this.jetFile = jetFile; this.jetFile = jetFile;
this.namespacePartName = namespacePartName; this.packagePartName = packagePartName;
this.context = context; this.context = context;
descriptor = state.getBindingContext().get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, jetFile); descriptor = state.getBindingContext().get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, jetFile);
assert descriptor != null : "No namespace found for jetFile " + jetFile + " declared package: " + jetFile.getPackageName(); assert descriptor != null : "No package fragment found for jetFile " + jetFile + " declared package: " + jetFile.getPackageName();
} }
public void generate() { public void generate() {
v.defineClass(jetFile, V1_6, v.defineClass(jetFile, V1_6,
ACC_PUBLIC | ACC_FINAL, ACC_PUBLIC | ACC_FINAL,
namespacePartName.getInternalName(), packagePartName.getInternalName(),
null, null,
"java/lang/Object", "java/lang/Object",
ArrayUtil.EMPTY_STRING_ARRAY ArrayUtil.EMPTY_STRING_ARRAY
@@ -122,7 +122,7 @@ public class NamespacePartCodegen extends MemberCodegen {
} }
mv.visitInsn(RETURN); mv.visitInsn(RETURN);
FunctionCodegen.endVisit(mv, "static initializer for namespace", jetFile); FunctionCodegen.endVisit(mv, "static initializer for package", jetFile);
mv.visitEnd(); mv.visitEnd();
} }
} }
@@ -333,9 +333,9 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
// working around a problem with shallow analysis // working around a problem with shallow analysis
if (propertyDescriptor == null) return; if (propertyDescriptor == null) return;
String nameForClassOrNamespaceMember = getNameForClassOrNamespaceMember(propertyDescriptor); String nameForClassOrPackageMember = getNameForClassOrPackageMember(propertyDescriptor);
if (nameForClassOrNamespaceMember != null) { if (nameForClassOrPackageMember != null) {
nameStack.push(nameForClassOrNamespaceMember); nameStack.push(nameForClassOrPackageMember);
} }
else { else {
nameStack.push(peekFromStack(nameStack) + '$' + property.getName()); nameStack.push(peekFromStack(nameStack) + '$' + property.getName());
@@ -350,9 +350,9 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
// working around a problem with shallow analysis // working around a problem with shallow analysis
if (functionDescriptor == null) return; if (functionDescriptor == null) return;
String nameForClassOrNamespaceMember = getNameForClassOrNamespaceMember(functionDescriptor); String nameForClassOrPackageMember = getNameForClassOrPackageMember(functionDescriptor);
if (nameForClassOrNamespaceMember != null) { if (nameForClassOrPackageMember != null) {
nameStack.push(nameForClassOrNamespaceMember); nameStack.push(nameForClassOrPackageMember);
super.visitNamedFunction(function); super.visitNamedFunction(function);
nameStack.pop(); nameStack.pop();
} }
@@ -371,7 +371,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
} }
@Nullable @Nullable
private String getNameForClassOrNamespaceMember(@NotNull DeclarationDescriptor descriptor) { private String getNameForClassOrPackageMember(@NotNull DeclarationDescriptor descriptor) {
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
String peek = peekFromStack(nameStack); String peek = peekFromStack(nameStack);
@@ -61,7 +61,7 @@ public class CodegenBinding {
public static void initTrace(BindingTrace bindingTrace, Collection<JetFile> files) { public static void initTrace(BindingTrace bindingTrace, Collection<JetFile> files) {
CodegenAnnotatingVisitor visitor = new CodegenAnnotatingVisitor(bindingTrace); CodegenAnnotatingVisitor visitor = new CodegenAnnotatingVisitor(bindingTrace);
for (JetFile file : allFilesInNamespaces(bindingTrace.getBindingContext(), files)) { for (JetFile file : allFilesInPackages(bindingTrace.getBindingContext(), files)) {
file.accept(visitor); file.accept(visitor);
} }
} }
@@ -223,7 +223,7 @@ public class CodegenBinding {
} }
@NotNull @NotNull
public static Collection<JetFile> allFilesInNamespaces(BindingContext bindingContext, Collection<JetFile> files) { public static Collection<JetFile> allFilesInPackages(BindingContext bindingContext, Collection<JetFile> files) {
// todo: we use Set and add given files but ignoring other scripts because something non-clear kept in binding // todo: we use Set and add given files but ignoring other scripts because something non-clear kept in binding
// for scripts especially in case of REPL // for scripts especially in case of REPL
@@ -22,7 +22,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.jet.codegen.NamespaceCodegen; import org.jetbrains.jet.codegen.PackageCodegen;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -121,7 +121,7 @@ public final class PsiCodegenPredictor {
} }
// NOTE: looks like a bug - for class in getter of top level property class name will be $propertyName$ClassName but not // NOTE: looks like a bug - for class in getter of top level property class name will be $propertyName$ClassName but not
// namespace$propertyName$ClassName // PackageClassName$propertyName$ClassName
if (declaration instanceof JetProperty) { if (declaration instanceof JetProperty) {
return parentInternalName + "$" + name.asString(); return parentInternalName + "$" + name.asString();
} }
@@ -134,9 +134,9 @@ public final class PsiCodegenPredictor {
} }
@Nullable @Nullable
public static JetFile getFileForNamespacePartName(@NotNull Collection<JetFile> allNamespaceFiles, @NotNull JvmClassName className) { public static JetFile getFileForPackagePartName(@NotNull Collection<JetFile> allPackageFiles, @NotNull JvmClassName className) {
for (JetFile file : allNamespaceFiles) { for (JetFile file : allPackageFiles) {
String internalName = NamespaceCodegen.getNamespacePartInternalName(file); String internalName = PackageCodegen.getPackagePartInternalName(file);
JvmClassName jvmClassName = JvmClassName.byInternalName(internalName); JvmClassName jvmClassName = JvmClassName.byInternalName(internalName);
if (jvmClassName.equals(className)) { if (jvmClassName.equals(className)) {
return file; return file;
@@ -148,7 +148,7 @@ public final class PsiCodegenPredictor {
@Nullable @Nullable
public static JetFile getFileForCodegenNamedClass( public static JetFile getFileForCodegenNamedClass(
@NotNull BindingContext context, @NotNull BindingContext context,
@NotNull Collection<JetFile> allNamespaceFiles, @NotNull Collection<JetFile> allPackageFiles,
@NotNull final String classInternalName @NotNull final String classInternalName
) { ) {
final Ref<DeclarationDescriptor> resultingDescriptor = Ref.create(); final Ref<DeclarationDescriptor> resultingDescriptor = Ref.create();
@@ -165,7 +165,7 @@ public final class PsiCodegenPredictor {
} }
}; };
CodegenBinding.initTrace(trace, allNamespaceFiles); CodegenBinding.initTrace(trace, allPackageFiles);
return resultingDescriptor.isNull() ? null return resultingDescriptor.isNull() ? null
: BindingContextUtils.getContainingFile(trace.getBindingContext(), resultingDescriptor.get()); : BindingContextUtils.getContainingFile(trace.getBindingContext(), resultingDescriptor.get());
@@ -101,7 +101,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
return thisDescriptor != null; return thisDescriptor != null;
} }
public DeclarationDescriptor getClassOrNamespaceDescriptor() { public DeclarationDescriptor getClassOrPackageDescriptor() {
CodegenContext c = this; CodegenContext c = this;
while (true) { while (true) {
assert c != null; assert c != null;
@@ -408,7 +408,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
} }
CodegenContext descriptorContext = null; CodegenContext descriptorContext = null;
if (!fromOutsideContext || getClassOrNamespaceDescriptor() != descriptor.getContainingDeclaration()) { if (!fromOutsideContext || getClassOrPackageDescriptor() != descriptor.getContainingDeclaration()) {
DeclarationDescriptor enclosed = descriptor.getContainingDeclaration(); DeclarationDescriptor enclosed = descriptor.getContainingDeclaration();
boolean isClassObjectMember = DescriptorUtils.isClassObject(enclosed); boolean isClassObjectMember = DescriptorUtils.isClassObject(enclosed);
//go upper //go upper
@@ -34,6 +34,6 @@ public class PackageContext extends FieldOwnerContext<PackageFragmentDescriptor>
@Override @Override
public String toString() { public String toString() {
return "Namespace: " + getContextDescriptor().getName(); return "Package: " + getContextDescriptor().getName();
} }
} }
@@ -135,7 +135,7 @@ public class JetTypeMapper extends BindingTraceAware {
// It's not a package created for Java class statics // It's not a package created for Java class statics
JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor); JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor);
if (insideModule && file != null) { if (insideModule && file != null) {
return NamespaceCodegen.getNamespacePartInternalName(file); return PackageCodegen.getPackagePartInternalName(file);
} }
else { else {
return PackageClassUtils.getPackageClassFqName(packageFragment.getFqName()).asString().replace('.', '/'); return PackageClassUtils.getPackageClassFqName(packageFragment.getFqName()).asString().replace('.', '/');
@@ -149,8 +149,8 @@ public class CompileEnvironmentUtil {
loader = new GeneratedClassLoader(factory, KotlinToJVMBytecodeCompiler.class.getClassLoader()); loader = new GeneratedClassLoader(factory, KotlinToJVMBytecodeCompiler.class.getClassLoader());
} }
try { try {
Class namespaceClass = loader.loadClass(PackageClassUtils.getPackageClassName(FqName.ROOT)); Class packageClass = loader.loadClass(PackageClassUtils.getPackageClassName(FqName.ROOT));
Method method = namespaceClass.getDeclaredMethod("project"); Method method = packageClass.getDeclaredMethod("project");
if (method == null) { if (method == null) {
throw new CompileEnvironmentException("Module script " + moduleFile + " must define project() function"); throw new CompileEnvironmentException("Module script " + moduleFile + " must define project() function");
} }
@@ -284,12 +284,12 @@ public class ReplInterpreter {
private ScriptDescriptor doAnalyze(@NotNull JetFile psiFile, @NotNull MessageCollector messageCollector) { private ScriptDescriptor doAnalyze(@NotNull JetFile psiFile, @NotNull MessageCollector messageCollector) {
WritableScope scope = new WritableScopeImpl( WritableScope scope = new WritableScopeImpl(
JetScope.EMPTY, module, JetScope.EMPTY, module,
new TraceBasedRedeclarationHandler(trace), "Root scope in analyzeNamespace"); new TraceBasedRedeclarationHandler(trace), "Root scope in analyzePackage");
scope.changeLockLevel(WritableScope.LockLevel.BOTH); scope.changeLockLevel(WritableScope.LockLevel.BOTH);
// Import a scope that contains all top-level namespaces that come from dependencies // Import a scope that contains all top-level packages that come from dependencies
// This makes the namespaces visible at all, does not import themselves // This makes the packages visible at all, does not import themselves
scope.importScope(module.getPackage(FqName.ROOT).getMemberScope()); scope.importScope(module.getPackage(FqName.ROOT).getMemberScope());
if (lastLineScope != null) { if (lastLineScope != null) {
@@ -299,7 +299,7 @@ public class ReplInterpreter {
scope.changeLockLevel(WritableScope.LockLevel.READING); scope.changeLockLevel(WritableScope.LockLevel.READING);
// dummy builder is used because "root" is module descriptor, // dummy builder is used because "root" is module descriptor,
// namespaces added to module explicitly in // packages added to module explicitly in
injector.getTopDownAnalyzer().doProcess(scope, new PackageLikeBuilderDummy(), Collections.singletonList(psiFile)); injector.getTopDownAnalyzer().doProcess(scope, new PackageLikeBuilderDummy(), Collections.singletonList(psiFile));
boolean hasErrors = AnalyzerWithCompilerReport.reportDiagnostics(trace.getBindingContext(), messageCollector); boolean hasErrors = AnalyzerWithCompilerReport.reportDiagnostics(trace.getBindingContext(), messageCollector);
@@ -349,7 +349,7 @@ public class ReplInterpreter {
registerClassNameForScript(state.getBindingTrace(), script, classType); registerClassNameForScript(state.getBindingTrace(), script, classType);
state.beforeCompile(); state.beforeCompile();
KotlinCodegenFacade.generateNamespace( KotlinCodegenFacade.generatePackage(
state, state,
JetPsiUtil.getFQName((JetFile) script.getContainingFile()), JetPsiUtil.getFQName((JetFile) script.getContainingFile()),
Collections.singleton((JetFile) script.getContainingFile()), Collections.singleton((JetFile) script.getContainingFile()),
@@ -34,7 +34,7 @@ import com.intellij.util.SmartList;
import com.intellij.util.containers.SLRUCache; import com.intellij.util.containers.SLRUCache;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.NamespaceCodegen; import org.jetbrains.jet.codegen.PackageCodegen;
import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetEnumEntry; import org.jetbrains.jet.lang.psi.JetEnumEntry;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
@@ -145,7 +145,7 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
private void findPackageClass(FqName qualifiedName, GlobalSearchScope scope, List<PsiClass> answer) { private void findPackageClass(FqName qualifiedName, GlobalSearchScope scope, List<PsiClass> answer) {
Collection<JetFile> filesForPackage = lightClassGenerationSupport.findFilesForPackage(qualifiedName, scope); Collection<JetFile> filesForPackage = lightClassGenerationSupport.findFilesForPackage(qualifiedName, scope);
if (!filesForPackage.isEmpty() && NamespaceCodegen.shouldGenerateNSClass(filesForPackage)) { if (!filesForPackage.isEmpty() && PackageCodegen.shouldGeneratePackageClass(filesForPackage)) {
KotlinLightClassForPackage lightClass = KotlinLightClassForPackage.create(psiManager, qualifiedName, scope, filesForPackage); KotlinLightClassForPackage lightClass = KotlinLightClassForPackage.create(psiManager, qualifiedName, scope, filesForPackage);
if (lightClass != null) { if (lightClass != null) {
answer.add(lightClass); answer.add(lightClass);
@@ -39,7 +39,7 @@ import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.CompilationErrorHandler; import org.jetbrains.jet.codegen.CompilationErrorHandler;
import org.jetbrains.jet.codegen.NamespaceCodegen; import org.jetbrains.jet.codegen.PackageCodegen;
import org.jetbrains.jet.codegen.binding.CodegenBinding; import org.jetbrains.jet.codegen.binding.CodegenBinding;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.Progress; import org.jetbrains.jet.codegen.state.Progress;
@@ -96,7 +96,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
@Override @Override
public void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files) { public void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files) {
NamespaceCodegen codegen = state.getFactory().forNamespace(packageFqName, files); PackageCodegen codegen = state.getFactory().forPackage(packageFqName, files);
codegen.generate(CompilationErrorHandler.THROW_EXCEPTION); codegen.generate(CompilationErrorHandler.THROW_EXCEPTION);
state.getFactory().asList(); state.getFactory().asList();
} }
@@ -169,8 +169,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
@Override @Override
public void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files) { public void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files) {
NamespaceCodegen namespaceCodegen = state.getFactory().forNamespace(getPackageFqName(), files); PackageCodegen packageCodegen = state.getFactory().forPackage(getPackageFqName(), files);
namespaceCodegen.generateClassOrObject(classOrObject); packageCodegen.generateClassOrObject(classOrObject);
state.getFactory().asList(); state.getFactory().asList();
} }
} }
@@ -46,7 +46,7 @@ public class AnnotationGenTest extends CodegenTestCase {
} }
private Class<?> getPackageSrcClass(@NotNull ClassLoader loader) throws ClassNotFoundException { private Class<?> getPackageSrcClass(@NotNull ClassLoader loader) throws ClassNotFoundException {
return loader.loadClass(NamespaceCodegen.getNamespacePartInternalName(myFiles.getPsiFile())); return loader.loadClass(PackageCodegen.getPackagePartInternalName(myFiles.getPsiFile()));
} }
public void testPropField() throws Exception { public void testPropField() throws Exception {
@@ -167,14 +167,14 @@ public abstract class CodegenTestCase extends UsefulTestCase {
} }
@NotNull @NotNull
protected Class<?> generateNamespaceClass() { protected Class<?> generatePackageClass() {
FqName packageFqName = JetPsiUtil.getFQName(myFiles.getPsiFile()); FqName packageFqName = JetPsiUtil.getFQName(myFiles.getPsiFile());
return generateClass(getPackageClassFqName(packageFqName).asString()); return generateClass(getPackageClassFqName(packageFqName).asString());
} }
@NotNull @NotNull
protected Class<?> generateNamespaceSrcClass() { protected Class<?> generatePackagePartClass() {
String name = NamespaceCodegen.getNamespacePartInternalName(myFiles.getPsiFile()); String name = PackageCodegen.getPackagePartInternalName(myFiles.getPsiFile());
return generateClass(name); return generateClass(name);
} }
@@ -263,7 +263,7 @@ public abstract class CodegenTestCase extends UsefulTestCase {
@NotNull @NotNull
protected Method generateFunction() { protected Method generateFunction() {
Class<?> aClass = generateNamespaceClass(); Class<?> aClass = generatePackageClass();
try { try {
return findTheOnlyMethod(aClass); return findTheOnlyMethod(aClass);
} catch (Error e) { } catch (Error e) {
@@ -274,7 +274,7 @@ public abstract class CodegenTestCase extends UsefulTestCase {
@NotNull @NotNull
protected Method generateFunction(@NotNull String name) { protected Method generateFunction(@NotNull String name) {
Class<?> aClass = generateNamespaceClass(); Class<?> aClass = generatePackageClass();
Method method = findDeclaredMethodByName(aClass, name); Method method = findDeclaredMethodByName(aClass, name);
if (method == null) { if (method == null) {
throw new IllegalArgumentException("Couldn't find method " + name + " in class " + aClass); throw new IllegalArgumentException("Couldn't find method " + name + " in class " + aClass);
@@ -47,7 +47,7 @@ public class JUnitUsageGenTest extends CodegenTestCase {
public void testKt1592() throws Exception { public void testKt1592() throws Exception {
loadFile("junit/kt1592.kt"); loadFile("junit/kt1592.kt");
Class<?> namespaceClass = generateNamespaceClass(); Class<?> namespaceClass = generatePackageClass();
Method method = namespaceClass.getMethod("foo", Method.class); Method method = namespaceClass.getMethod("foo", Method.class);
method.setAccessible(true); method.setAccessible(true);
Annotation annotation = method.getAnnotation(getCorrespondingAnnotationClass(Test.class)); Annotation annotation = method.getAnnotation(getCorrespondingAnnotationClass(Test.class));
@@ -159,7 +159,7 @@ public class PrimitiveTypesTest extends CodegenTestCase {
public void testCastOnStack() throws Exception { public void testCastOnStack() throws Exception {
loadText("fun foo(): Double = System.currentTimeMillis().toDouble()"); loadText("fun foo(): Double = System.currentTimeMillis().toDouble()");
Class<?> mainClass = generateNamespaceSrcClass(); Class<?> mainClass = generatePackagePartClass();
Method main = mainClass.getDeclaredMethod("foo"); Method main = mainClass.getDeclaredMethod("foo");
double currentTimeMillis = (double) System.currentTimeMillis(); double currentTimeMillis = (double) System.currentTimeMillis();
double result = (Double) main.invoke(null); double result = (Double) main.invoke(null);
@@ -76,7 +76,7 @@ public class PropertyGenTest extends CodegenTestCase {
public void testPrivatePropertyInNamespace() throws Exception { public void testPrivatePropertyInNamespace() throws Exception {
loadText("private val x = 239"); loadText("private val x = 239");
Class nsClass = generateNamespaceSrcClass(); Class nsClass = generatePackagePartClass();
Field[] fields = nsClass.getDeclaredFields(); Field[] fields = nsClass.getDeclaredFields();
assertEquals(1, fields.length); assertEquals(1, fields.length);
Field field = fields[0]; Field field = fields[0];
@@ -37,7 +37,7 @@ import org.jetbrains.annotations.TestOnly;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.ClassBuilderMode;
import org.jetbrains.jet.codegen.NamespaceCodegen; import org.jetbrains.jet.codegen.PackageCodegen;
import org.jetbrains.jet.codegen.binding.CodegenBinding; import org.jetbrains.jet.codegen.binding.CodegenBinding;
import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
@@ -154,7 +154,7 @@ public class JetPositionManager implements PositionManager {
} }
if (result.isNull()) { if (result.isNull()) {
result.set(NamespaceCodegen.getNamespacePartInternalName(namespace)); result.set(PackageCodegen.getPackagePartInternalName(namespace));
} }
} }
}); });
@@ -65,7 +65,7 @@ public class DebuggerUtils {
} }
Collection<JetFile> allNamespaceFiles = filesProvider.allNamespaceFiles().fun(anyFile); Collection<JetFile> allNamespaceFiles = filesProvider.allNamespaceFiles().fun(anyFile);
JetFile file = PsiCodegenPredictor.getFileForNamespacePartName(allNamespaceFiles, className); JetFile file = PsiCodegenPredictor.getFileForPackagePartName(allNamespaceFiles, className);
if (file != null) { if (file != null) {
return file; return file;
} }
@@ -21,7 +21,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.testFramework.LightVirtualFile; import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.Function; import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.jet.codegen.NamespaceCodegen; import org.jetbrains.jet.codegen.PackageCodegen;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jps.builders.BuildResult; import org.jetbrains.jps.builders.BuildResult;
import org.jetbrains.jps.model.java.JpsJavaDependencyScope; import org.jetbrains.jps.model.java.JpsJavaDependencyScope;
@@ -323,7 +323,7 @@ public class KotlinJpsBuildTest extends AbstractKotlinJpsBuildTestCase {
return super.getPath().substring(1); return super.getPath().substring(1);
} }
}; };
return NamespaceCodegen.getNamespacePartType(new FqName(packageClassFqName), fakeVirtualFile).getInternalName(); return PackageCodegen.getPackagePartType(new FqName(packageClassFqName), fakeVirtualFile).getInternalName();
} }
private static enum Operation { private static enum Operation {