Rename namespace class to {package.name}Package

Conflicts:

	compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java
This commit is contained in:
Natalia.Ukhorskaya
2013-01-11 12:00:27 +04:00
parent 0f2fa6bade
commit 47abdcf565
113 changed files with 436 additions and 193 deletions
@@ -27,7 +27,8 @@ public class AbstractCodegenTestCaseOnAndroid extends TestCase {
protected void invokeBoxMethod(String filePath, String expectedResult) throws Exception { protected void invokeBoxMethod(String filePath, String expectedResult) throws Exception {
try { try {
Class clazz; Class clazz;
clazz = Class.forName(filePath.replaceAll("\\\\|-|\\.|/", "_") + ".namespace"); String packageName = filePath.replaceAll("\\\\|-|\\.|/", "_");
clazz = Class.forName(packageName + "." + getPackageClassName(packageName));
Method method; Method method;
method = clazz.getMethod("box"); method = clazz.getMethod("box");
assertEquals(expectedResult, method.invoke(null)); assertEquals(expectedResult, method.invoke(null));
@@ -36,4 +37,8 @@ public class AbstractCodegenTestCaseOnAndroid extends TestCase {
throw new RuntimeException("File: " + filePath, e); throw new RuntimeException("File: " + filePath, e);
} }
} }
public static String getPackageClassName(String packageName) {
return Character.toUpperCase(packageName.charAt(0)) + packageName.substring(1, packageName.length()) + "Package";
}
} }
@@ -33,8 +33,8 @@ import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
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;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -142,7 +142,8 @@ public class NamespaceCodegen extends MemberCodegen {
} }
if (k > 0) { if (k > 0) {
String namespaceInternalName = JvmClassName.byFqNameWithoutInnerClasses(name.child(Name.identifier(JvmAbi.PACKAGE_CLASS))).getInternalName(); String namespaceInternalName = JvmClassName.byFqNameWithoutInnerClasses(
PackageClassUtils.getPackageClassFqName(name)).getInternalName();
String className = getMultiFileNamespaceInternalName(namespaceInternalName, file); String className = getMultiFileNamespaceInternalName(namespaceInternalName, file);
ClassBuilder builder = state.getFactory().forNamespacepart(className, file); ClassBuilder builder = state.getFactory().forNamespacepart(className, file);
@@ -271,11 +272,12 @@ public class NamespaceCodegen extends MemberCodegen {
@NotNull @NotNull
public static JvmClassName getJVMClassNameForKotlinNs(@NotNull FqName fqName) { public static JvmClassName getJVMClassNameForKotlinNs(@NotNull FqName fqName) {
String packageClassName = PackageClassUtils.getPackageClassName(fqName);
if (fqName.isRoot()) { if (fqName.isRoot()) {
return JvmClassName.byInternalName(JvmAbi.PACKAGE_CLASS); return JvmClassName.byInternalName(packageClassName);
} }
return JvmClassName.byFqNameWithoutInnerClasses(fqName.child(Name.identifier(JvmAbi.PACKAGE_CLASS))); return JvmClassName.byFqNameWithoutInnerClasses(fqName.child(Name.identifier(packageClassName)));
} }
@NotNull @NotNull
@@ -24,6 +24,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -255,11 +257,13 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
} }
else if (containingDeclaration instanceof NamespaceDescriptor) { else if (containingDeclaration instanceof NamespaceDescriptor) {
String peek = peekFromStack(nameStack); String peek = peekFromStack(nameStack);
FqName qualifiedName = ((NamespaceDescriptor) containingDeclaration).getQualifiedName();
String packageClassName = PackageClassUtils.getPackageClassName(qualifiedName);
if (peek.isEmpty()) { if (peek.isEmpty()) {
peek = JvmAbi.PACKAGE_CLASS; peek = packageClassName;
} }
else { else {
peek += "/" + JvmAbi.PACKAGE_CLASS; peek += "/" + packageClassName;
} }
nameStack.push(peek + '$' + function.getName()); nameStack.push(peek + '$' + function.getName());
super.visitNamedFunction(function); super.visitNamedFunction(function);
@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace; import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.util.slicedmap.WritableSlice; import org.jetbrains.jet.util.slicedmap.WritableSlice;
@@ -144,9 +145,10 @@ public final class PsiCodegenPredictor {
private static JvmClassName addPackageClass(JvmClassName packageName) { private static JvmClassName addPackageClass(JvmClassName packageName) {
FqName name = packageName.getFqName(); FqName name = packageName.getFqName();
String packageClassName = PackageClassUtils.getPackageClassName(name);
return name.isRoot() ? return name.isRoot() ?
JvmClassName.byFqNameWithoutInnerClasses(JvmAbi.PACKAGE_CLASS) : JvmClassName.byFqNameWithoutInnerClasses(packageClassName) :
JvmClassName.byInternalName(packageName.getInternalName() + "/" + JvmAbi.PACKAGE_CLASS); JvmClassName.byInternalName(packageName.getInternalName() + "/" + packageClassName);
} }
public static boolean checkPredictedClassNameForFun( public static boolean checkPredictedClassNameForFun(
@@ -145,7 +145,7 @@ public class JetTypeMapper extends BindingTraceAware {
if (r.length() > 0) { if (r.length() > 0) {
r.append("/"); r.append("/");
} }
r.append("namespace"); r.append(PackageClassUtils.getPackageClassName(namespace.getQualifiedName()));
} }
if (r.length() == 0) { if (r.length() == 0) {
@@ -33,7 +33,7 @@ import org.jetbrains.jet.codegen.GeneratedClassLoader;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.config.CommonConfigurationKeys; import org.jetbrains.jet.config.CommonConfigurationKeys;
import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.utils.KotlinPaths; import org.jetbrains.jet.utils.KotlinPaths;
import org.jetbrains.jet.utils.PathUtil; import org.jetbrains.jet.utils.PathUtil;
@@ -137,7 +137,7 @@ public class CompileEnvironmentUtil {
loader = new GeneratedClassLoader(factory, KotlinToJVMBytecodeCompiler.class.getClassLoader()); loader = new GeneratedClassLoader(factory, KotlinToJVMBytecodeCompiler.class.getClassLoader());
} }
try { try {
Class namespaceClass = loader.loadClass(JvmAbi.PACKAGE_CLASS); Class namespaceClass = loader.loadClass(PackageClassUtils.getPackageClassName(FqName.ROOT));
final Method method = namespaceClass.getDeclaredMethod("project"); final Method method = namespaceClass.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");
@@ -47,7 +47,7 @@ import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.ScriptNameUtil; import org.jetbrains.jet.lang.resolve.ScriptNameUtil;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.plugin.JetMainDetector; import org.jetbrains.jet.plugin.JetMainDetector;
@@ -166,7 +166,7 @@ public class KotlinToJVMBytecodeCompiler {
return null; return null;
} }
FqName fqName = JetPsiUtil.getFQName(file); FqName fqName = JetPsiUtil.getFQName(file);
mainClass = fqName.child(Name.identifier(JvmAbi.PACKAGE_CLASS)); mainClass = PackageClassUtils.getPackageClassFqName(fqName);
} }
} }
return mainClass; return mainClass;
@@ -46,7 +46,7 @@ public final class DescriptorResolverUtils {
} }
public static boolean isKotlinClass(@NotNull PsiClass psiClass) { public static boolean isKotlinClass(@NotNull PsiClass psiClass) {
return new PsiClassWrapper(psiClass).getJetClass().isDefined() || psiClass.getName().equals(JvmAbi.PACKAGE_CLASS); return new PsiClassWrapper(psiClass).getJetClass().isDefined() || PackageClassUtils.isPackageClass(psiClass);
} }
public static boolean isInnerEnum(@NotNull PsiClass innerClass, @Nullable DeclarationDescriptor owner) { public static boolean isInnerEnum(@NotNull PsiClass innerClass, @Nullable DeclarationDescriptor owner) {
@@ -23,7 +23,6 @@ public class JvmAbi {
public static final String DEFAULT_PARAMS_IMPL_SUFFIX = "$default"; public static final String DEFAULT_PARAMS_IMPL_SUFFIX = "$default";
public static final String GETTER_PREFIX = "get"; public static final String GETTER_PREFIX = "get";
public static final String SETTER_PREFIX = "set"; public static final String SETTER_PREFIX = "set";
public static final String PACKAGE_CLASS = "namespace";
public static final String CLASS_OBJECT_CLASS_NAME = "object"; public static final String CLASS_OBJECT_CLASS_NAME = "object";
public static final String CLASS_OBJECT_SUFFIX = "$" + CLASS_OBJECT_CLASS_NAME; public static final String CLASS_OBJECT_SUFFIX = "$" + CLASS_OBJECT_CLASS_NAME;
@@ -0,0 +1,58 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.java;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
public class PackageClassUtils {
private static final String DEFAULT_PACKAGE = "_DefaultPackage";
// ex. <root> -> _DefaultPackage, a -> APackage, a.b -> BPackage
public static String getPackageClassName(@NotNull FqName packageFQN) {
if (packageFQN.isRoot()) {
return DEFAULT_PACKAGE;
}
return StringUtil.capitalize(packageFQN.shortName().getName()) + "Package";
}
public static FqName getPackageClassFqName(@NotNull FqName packageFQN) {
return packageFQN.child(Name.identifier(getPackageClassName(packageFQN)));
}
public static boolean isPackageClass(@NotNull FqName fqName) {
if (fqName.isRoot()) {
return true;
}
return getPackageClassName(fqName.parent()).equals(fqName.shortName().getName());
}
public static boolean isPackageClass(@NotNull PsiClass psiClass) {
String qualifiedName = psiClass.getQualifiedName();
if (qualifiedName == null) {
return false;
}
if (DEFAULT_PACKAGE.equals(qualifiedName)) {
return true;
}
return getPackageClassName(new FqName(qualifiedName).parent()).equals(psiClass.getName());
}
}
@@ -203,7 +203,6 @@ public final class JavaNamespaceResolver {
@Nullable @Nullable
private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) { private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
return psiClassFinder.findPsiClass(packageFQN.child(Name.identifier(JvmAbi.PACKAGE_CLASS)), return psiClassFinder.findPsiClass(PackageClassUtils.getPackageClassFqName(packageFQN), PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
} }
} }
@@ -53,7 +53,7 @@ public final class ScopeUtils {
} }
for (PsiClass psiClass : javaSemanticServices.getPsiClassFinder().findPsiClasses(psiPackage)) { for (PsiClass psiClass : javaSemanticServices.getPsiClassFinder().findPsiClasses(psiPackage)) {
if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) { if (isKotlinNamespace && PackageClassUtils.isPackageClass(psiClass)) {
continue; continue;
} }
@@ -62,7 +62,7 @@ public final class ScopeUtils {
} }
// TODO: Temp hack for collection function descriptors from java // TODO: Temp hack for collection function descriptors from java
if (JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) { if (PackageClassUtils.isPackageClass(psiClass)) {
continue; continue;
} }
@@ -29,7 +29,7 @@ public class AntTaskTest extends KotlinIntegrationTestBase {
String runtime = new File("dist/kotlinc/lib/kotlin-runtime.jar").getAbsolutePath(); String runtime = new File("dist/kotlinc/lib/kotlin-runtime.jar").getAbsolutePath();
assertEquals("compilation failed", 0, runAnt("build.log", "build.xml")); assertEquals("compilation failed", 0, runAnt("build.log", "build.xml"));
runJava("hello.run", "-cp", jar + File.pathSeparator + runtime, "Hello.namespace"); runJava("hello.run", "-cp", jar + File.pathSeparator + runtime, "Hello.HelloPackage");
} }
@Override @Override
@@ -29,7 +29,7 @@ public class CompilerSmokeTest extends KotlinIntegrationTestBase {
final String jar = tmpdir.getTmpDir().getAbsolutePath() + File.separator + "hello.jar"; final String jar = tmpdir.getTmpDir().getAbsolutePath() + File.separator + "hello.jar";
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-src", "hello.kt", "-jar", jar)); assertEquals("compilation failed", 0, runCompiler("hello.compile", "-src", "hello.kt", "-jar", jar));
runJava("hello.run", "-cp", jar, "Hello.namespace"); runJava("hello.run", "-cp", jar, "Hello.HelloPackage");
} }
@Test @Test
@@ -37,7 +37,7 @@ public class CompilerSmokeTest extends KotlinIntegrationTestBase {
final String jar = tmpdir.getTmpDir().getAbsolutePath() + File.separator + "smoke.jar"; final String jar = tmpdir.getTmpDir().getAbsolutePath() + File.separator + "smoke.jar";
assertEquals("compilation failed", 0, runCompiler("Smoke.compile", "-module", "Smoke.kts", "-jar", jar)); assertEquals("compilation failed", 0, runCompiler("Smoke.compile", "-module", "Smoke.kts", "-jar", jar));
runJava("Smoke.run", "-cp", jar + File.pathSeparator + getKotlinRuntimePath(), "Smoke.namespace", "1", "2", "3"); runJava("Smoke.run", "-cp", jar + File.pathSeparator + getKotlinRuntimePath(), "Smoke.SmokePackage", "1", "2", "3");
} }
@Test @Test
@@ -32,7 +32,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.NamespaceCodegen; import org.jetbrains.jet.codegen.NamespaceCodegen;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks; import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -87,8 +87,9 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
findClassesAndObjects(qualifiedName, scope, answer); findClassesAndObjects(qualifiedName, scope, answer);
if (JvmAbi.PACKAGE_CLASS.equals(qualifiedName.shortName().getName())) { FqName packageFQN = qualifiedName.parent();
findPackageClass(qualifiedName.parent(), scope, answer); if (PackageClassUtils.getPackageClassFqName(packageFQN).equals(qualifiedName)) {
findPackageClass(packageFQN, scope, answer);
} }
return answer.toArray(new PsiClass[answer.size()]); return answer.toArray(new PsiClass[answer.size()]);
@@ -141,7 +142,7 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
Collection<JetClassOrObject> declarations = lightClassGenerationSupport.findClassOrObjectDeclarationsInPackage(packageFQN, scope); Collection<JetClassOrObject> declarations = lightClassGenerationSupport.findClassOrObjectDeclarationsInPackage(packageFQN, scope);
Set<String> answer = Sets.newHashSet(); Set<String> answer = Sets.newHashSet();
answer.add(JvmAbi.PACKAGE_CLASS); answer.add(PackageClassUtils.getPackageClassName(packageFQN));
for (JetClassOrObject declaration : declarations) { for (JetClassOrObject declaration : declarations) {
String name = declaration.getName(); String name = declaration.getName();
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2012 JetBrains s.r.o. * Copyright 2010-2013 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -30,9 +30,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.java.JetJavaMirrorMarker; import org.jetbrains.jet.lang.resolve.java.JetJavaMirrorMarker;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import javax.swing.*; import javax.swing.*;
import java.util.Collection; import java.util.Collection;
@@ -55,7 +54,7 @@ public class KotlinLightClassForPackage extends KotlinLightClassForPackageBase i
private KotlinLightClassForPackage(@NotNull PsiManager manager, @NotNull FqName packageFqName, @NotNull Collection<JetFile> files) { private KotlinLightClassForPackage(@NotNull PsiManager manager, @NotNull FqName packageFqName, @NotNull Collection<JetFile> files) {
super(manager); super(manager);
this.packageFqName = packageFqName; this.packageFqName = packageFqName;
this.packageClassFqName = packageFqName.child(Name.identifier(JvmAbi.PACKAGE_CLASS)); this.packageClassFqName = PackageClassUtils.getPackageClassFqName(packageFqName);
assert !files.isEmpty() : "No files for package " + packageFqName; assert !files.isEmpty() : "No files for package " + packageFqName;
this.files = Sets.newHashSet(files); // needed for hashCode this.files = Sets.newHashSet(files); // needed for hashCode
this.hashCode = computeHashCode(); this.hashCode = computeHashCode();
@@ -28,7 +28,11 @@ import org.jetbrains.asm4.ClassVisitor;
import org.jetbrains.asm4.FieldVisitor; import org.jetbrains.asm4.FieldVisitor;
import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.jet.codegen.ClassBuilder; import org.jetbrains.jet.codegen.ClassBuilder;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetNamedDeclaration;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import java.util.List; import java.util.List;
@@ -66,13 +70,20 @@ public class StubClassBuilder extends ClassBuilder {
v = new StubBuildingVisitor<Object>(null, EMPTY_STRATEGY, parent, access); v = new StubBuildingVisitor<Object>(null, EMPTY_STRATEGY, parent, access);
super.defineClass(origin, version, access, name, signature, superName, interfaces); super.defineClass(origin, version, access, name, signature, superName, interfaces);
if (name.equals(JvmAbi.PACKAGE_CLASS) || name.endsWith("/" + JvmAbi.PACKAGE_CLASS)) {
isNamespace = true; if (origin instanceof JetFile) {
FqName packageName = JetPsiUtil.getFQName((JetFile) origin);
String packageClassName = PackageClassUtils.getPackageClassName(packageName);
if (name.equals(packageClassName) || name.endsWith("/" + packageClassName)) {
isNamespace = true;
}
} }
else {
if (!isNamespace) {
parentStack.push(v.getResult()); parentStack.push(v.getResult());
} }
((StubBase) v.getResult()).putUserData(ClsWrapperStubPsiFactory.ORIGIN_ELEMENT, origin); ((StubBase) v.getResult()).putUserData(ClsWrapperStubPsiFactory.ORIGIN_ELEMENT, origin);
} }
@@ -7,5 +7,5 @@ fun foo() {
} }
// METHOD : invoke(I)V // METHOD : invoke(I)V
// VARIABLE : NAME=this TYPE=Lnamespace$foo$1$1; INDEX=0 // VARIABLE : NAME=this TYPE=L_DefaultPackage$foo$1$1; INDEX=0
// VARIABLE : NAME=it TYPE=I INDEX=1 // VARIABLE : NAME=it TYPE=I INDEX=1
@@ -0,0 +1,7 @@
fun foo() {
fun bar() {
}
}
// METHOD : invoke()V
// VARIABLE : NAME=this TYPE=L_DefaultPackage$foo$1; INDEX=0
@@ -0,0 +1,8 @@
fun foo() {
var a = {
}
}
// METHOD : invoke()V
// VARIABLE : NAME=this TYPE=L_DefaultPackage$foo$a$1; INDEX=0
@@ -0,0 +1,9 @@
fun foo1() {
(1..5).forEach {
println(it)
}
}
// METHOD : invoke(I)V
// VARIABLE : NAME=this TYPE=L_DefaultPackage$foo1$1; INDEX=0
// VARIABLE : NAME=it TYPE=I INDEX=1
@@ -1,7 +0,0 @@
fun foo() {
fun bar() {
}
}
// METHOD : invoke()V
// VARIABLE : NAME=this TYPE=Lnamespace$foo$1; INDEX=0
@@ -1,8 +0,0 @@
fun foo() {
var a = {
}
}
// METHOD : invoke()V
// VARIABLE : NAME=this TYPE=Lnamespace$foo$a$1; INDEX=0
@@ -1,9 +0,0 @@
fun foo1() {
(1..5).forEach {
println(it)
}
}
// METHOD : invoke(I)V
// VARIABLE : NAME=this TYPE=Lnamespace$foo1$1; INDEX=0
// VARIABLE : NAME=it TYPE=I INDEX=1
@@ -9,7 +9,7 @@ World""");
fun box() : String { fun box() : String {
// TODO compiler error // TODO compiler error
// both these expressions causes java.lang.NoClassDefFoundError: collections/namespace // both these expressions causes java.lang.NoClassDefFoundError: collections/CollectionPackage
val list1 = sample().useLines{it.toArrayList()} val list1 = sample().useLines{it.toArrayList()}
val list2 = sample().useLines<ArrayList<String>>{it.toArrayList()} val list2 = sample().useLines<ArrayList<String>>{it.toArrayList()}
@@ -1,6 +1,6 @@
class Any { class Any {
{ {
Object r = namespace.anyany(new Object(), null); Object r = _DefaultPackage.anyany(new Object(), null);
} }
} }
@@ -2,6 +2,6 @@
class ArrayOfIntArray { class ArrayOfIntArray {
{ {
int[][] a = new int[0][]; int[][] a = new int[0][];
int[][] r = namespace.ohMy(a); int[][] r = _DefaultPackage.ohMy(a);
} }
} }
@@ -2,6 +2,6 @@
class ArrayOfIntArray { class ArrayOfIntArray {
{ {
Integer[][] a = new Integer[0][]; Integer[][] a = new Integer[0][];
Integer[][] r = namespace.ohMy(a, null); Integer[][] r = _DefaultPackage.ohMy(a, null);
} }
} }
@@ -1,5 +1,5 @@
class GenericArray { class GenericArray {
public static void ggff() { public static void ggff() {
String[] s = namespace.ffgg(new String[0]); String[] s = _DefaultPackage.ffgg(new String[0]);
} }
} }
@@ -1,6 +1,6 @@
class Hello { class Hello {
public static void xx() { public static void xx() {
String s = namespace.f(); String s = _DefaultPackage.f();
} }
} }
@@ -1,6 +1,6 @@
class Int { class Int {
{ {
int r = namespace.lll(1); int r = _DefaultPackage.lll(1);
} }
} }
@@ -1,6 +1,6 @@
class IntArray { class IntArray {
{ {
int[] r = namespace.doNothing(new int[0], null); int[] r = _DefaultPackage.doNothing(new int[0], null);
} }
} }
@@ -1,6 +1,6 @@
class IntWithDefault { class IntWithDefault {
{ {
int r = namespace.www(1); int r = _DefaultPackage.www(1);
} }
} }
@@ -1,6 +1,6 @@
class IntArray { class IntArray {
{ {
Integer[] r = namespace.doNothing(new Integer[0], null); Integer[] r = _DefaultPackage.doNothing(new Integer[0], null);
} }
} }
@@ -5,7 +5,7 @@ class ListOfInt {
public static void hhh() { public static void hhh() {
List<Integer> list = new ArrayList<Integer>(); List<Integer> list = new ArrayList<Integer>();
List<Integer> r = namespace.ggg(list); List<Integer> r = _DefaultPackage.ggg(list);
} }
} }
@@ -4,6 +4,6 @@ import java.util.ArrayList;
class ListString { class ListString {
public static void gg() { public static void gg() {
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
namespace.ff(list); _DefaultPackage.ff(list);
} }
} }
@@ -5,7 +5,7 @@ class ListOfT {
public static void check() { public static void check() {
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
List<String> r = namespace.listOfT(list); List<String> r = _DefaultPackage.listOfT(list);
} }
} }
@@ -6,6 +6,6 @@ class MapOfKString {
public static void gfgdgfg() { public static void gfgdgfg() {
Map<BigDecimal, String> map = new HashMap<BigDecimal, String>(); Map<BigDecimal, String> map = new HashMap<BigDecimal, String>();
Map<BigDecimal, String> r = namespace.fff(map); Map<BigDecimal, String> r = _DefaultPackage.fff(map);
} }
} }
@@ -6,6 +6,6 @@ class MapOfKString {
public static void gfgdgfg() { public static void gfgdgfg() {
Map<String, Integer> map = new HashMap<String, Integer>(); Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer> r = namespace.fff(map); Map<String, Integer> r = _DefaultPackage.fff(map);
} }
} }
@@ -2,6 +2,6 @@ class Question {
// id2 is to prevent java type parameter type inference // id2 is to prevent java type parameter type inference
static <T> T id2(T p) { return p; } static <T> T id2(T p) { return p; }
{ {
java.util.List<? extends String> s = id2(namespace.id(null)); java.util.List<? extends String> s = id2(_DefaultPackage.id(null));
} }
} }
@@ -2,6 +2,6 @@ class Question {
// id2 is to prevent java type parameter type inference // id2 is to prevent java type parameter type inference
static <T> T id2(T p) { return p; } static <T> T id2(T p) { return p; }
{ {
String s = id2(namespace.id(null)); String s = id2(_DefaultPackage.id(null));
} }
} }
@@ -4,6 +4,6 @@ import java.util.ArrayList;
class Vararg { class Vararg {
{ {
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
List<String> r = namespace.gg(list, 3, 4, 5, 6); List<String> r = _DefaultPackage.gg(list, 3, 4, 5, 6);
} }
} }
@@ -1,5 +1,5 @@
class Void { class Void {
{ {
namespace.f(); _DefaultPackage.f();
} }
} }
@@ -3,5 +3,5 @@ class MyClass() { }
deprecated("") fun MyClass.test() {} deprecated("") fun MyClass.test() {}
// TESTED_OBJECT_KIND: function // TESTED_OBJECT_KIND: function
// TESTED_OBJECTS: namespace, test // TESTED_OBJECTS: _DefaultPackage, test
// FLAGS: ACC_DEPRECATED, ACC_PUBLIC, ACC_FINAL, ACC_STATIC // FLAGS: ACC_DEPRECATED, ACC_PUBLIC, ACC_FINAL, ACC_STATIC
@@ -1,5 +1,5 @@
deprecated("") fun test() {} deprecated("") fun test() {}
// TESTED_OBJECT_KIND: function // TESTED_OBJECT_KIND: function
// TESTED_OBJECTS: namespace, test // TESTED_OBJECTS: _DefaultPackage, test
// FLAGS: ACC_DEPRECATED, ACC_PUBLIC, ACC_FINAL, ACC_STATIC // FLAGS: ACC_DEPRECATED, ACC_PUBLIC, ACC_FINAL, ACC_STATIC
@@ -1,5 +1,5 @@
deprecated("") val test: Int = 0 deprecated("") val test: Int = 0
// TESTED_OBJECT_KIND: property // TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: namespace, test // TESTED_OBJECTS: _DefaultPackage, test
// FLAGS: ACC_DEPRECATED, ACC_FINAL, ACC_STATIC // FLAGS: ACC_DEPRECATED, ACC_FINAL, ACC_STATIC
@@ -1,6 +1,6 @@
fun never(): Array<java.lang.CharSequence> = throw Exception() fun never(): Array<java.lang.CharSequence> = throw Exception()
// method: namespace::never // method: _DefaultPackage::never
// jvm signature: ()[Ljava/lang/CharSequence; // jvm signature: ()[Ljava/lang/CharSequence;
// generic signature: null // generic signature: null
// kotlin signature: ()[Mjava/lang/CharSequence; // TODO: need to skip kotlin signature // kotlin signature: ()[Mjava/lang/CharSequence; // TODO: need to skip kotlin signature
@@ -1,6 +1,6 @@
fun never(): Array<Int> = throw Exception() fun never(): Array<Int> = throw Exception()
// method: namespace::never // method: _DefaultPackage::never
// jvm signature: ()[Ljava/lang/Integer; // jvm signature: ()[Ljava/lang/Integer;
// generic signature: null // generic signature: null
// kotlin signature: ()[Ljava/lang/Integer; // TODO: need to skip kotlin signature // kotlin signature: ()[Ljava/lang/Integer; // TODO: need to skip kotlin signature
@@ -1,6 +1,6 @@
fun cc(): Comparable<java.lang.CharSequence>? = null fun cc(): Comparable<java.lang.CharSequence>? = null
// method: namespace::cc // method: _DefaultPackage::cc
// jvm signature: ()Ljava/lang/Comparable; // jvm signature: ()Ljava/lang/Comparable;
// generic signature: ()Ljava/lang/Comparable<Ljava/lang/CharSequence;>; // generic signature: ()Ljava/lang/Comparable<Ljava/lang/CharSequence;>;
// kotlin signature: ()?Ljava/lang/Comparable<Mjava/lang/CharSequence;>; // kotlin signature: ()?Ljava/lang/Comparable<Mjava/lang/CharSequence;>;
+1 -1
View File
@@ -1,6 +1,6 @@
fun key(): Int = throw Exception() fun key(): Int = throw Exception()
// method: namespace::key // method: _DefaultPackage::key
// jvm signature: ()I // jvm signature: ()I
// generic signature: null // generic signature: null
// kotlin signature: ()I // TODO: make null // kotlin signature: ()I // TODO: make null
+1 -1
View File
@@ -1,6 +1,6 @@
fun never(): IntArray = throw Exception() fun never(): IntArray = throw Exception()
// method: namespace::never // method: _DefaultPackage::never
// jvm signature: ()[I // jvm signature: ()[I
// generic signature: null // generic signature: null
// kotlin signature: ()[I // TODO: need to skip kotlin signature // kotlin signature: ()[I // TODO: need to skip kotlin signature
+1 -1
View File
@@ -1,6 +1,6 @@
fun sometimes(): Int? = null fun sometimes(): Int? = null
// method: namespace::sometimes // method: _DefaultPackage::sometimes
// jvm signature: ()Ljava/lang/Integer; // jvm signature: ()Ljava/lang/Integer;
// generic signature: null // generic signature: null
// kotlin signature: ()?Ljava/lang/Integer; // TODO: need to skip kotlin signature // kotlin signature: ()?Ljava/lang/Integer; // TODO: need to skip kotlin signature
@@ -1,7 +1,7 @@
fun foo(p: List<CharSequence>) = 1 fun foo(p: List<CharSequence>) = 1
// method: namespace::foo // method: _DefaultPackage::foo
// jvm signature: (Ljava/util/List;)I // jvm signature: (Ljava/util/List;)I
// generic signature: (Ljava/util/List<+Ljava/lang/CharSequence;>;)I // generic signature: (Ljava/util/List<+Ljava/lang/CharSequence;>;)I
// kotlin signature: (Ljet/List<Ljava/lang/CharSequence;>;)I // TODO: skip Kotlin signature // kotlin signature: (Ljet/List<Ljava/lang/CharSequence;>;)I // TODO: skip Kotlin signature
@@ -1,7 +1,7 @@
fun listOfStar(): List<*> = throw Exception() fun listOfStar(): List<*> = throw Exception()
// method: namespace::listOfStar // method: _DefaultPackage::listOfStar
// jvm signature: ()Ljava/util/List; // jvm signature: ()Ljava/util/List;
// generic signature: ()Ljava/util/List<Ljava/lang/Object;>; // generic signature: ()Ljava/util/List<Ljava/lang/Object;>;
// kotlin signature: ()Ljet/List<?Ljava/lang/Object;>; // kotlin signature: ()Ljet/List<?Ljava/lang/Object;>;
+1 -1
View File
@@ -1,6 +1,6 @@
fun getEntry(): jet.Map.Entry<Int, String>? = null fun getEntry(): jet.Map.Entry<Int, String>? = null
// method: namespace::getEntry // method: _DefaultPackage::getEntry
// jvm signature: ()Ljava/util/Map$Entry; // jvm signature: ()Ljava/util/Map$Entry;
// generic signature: ()Ljava/util/Map$Entry<Ljava/lang/Integer;Ljava/lang/String;>; // generic signature: ()Ljava/util/Map$Entry<Ljava/lang/Integer;Ljava/lang/String;>;
// kotlin signature: ()?Ljet/Map.Entry<Ljava/lang/Integer;Ljava/lang/String;>; // kotlin signature: ()?Ljet/Map.Entry<Ljava/lang/Integer;Ljava/lang/String;>;
@@ -1,6 +1,6 @@
fun getEntry(): jet.MutableMap.MutableEntry<Int, String>? = null fun getEntry(): jet.MutableMap.MutableEntry<Int, String>? = null
// method: namespace::getEntry // method: _DefaultPackage::getEntry
// jvm signature: ()Ljava/util/Map$Entry; // jvm signature: ()Ljava/util/Map$Entry;
// generic signature: ()Ljava/util/Map$Entry<Ljava/lang/Integer;Ljava/lang/String;>; // generic signature: ()Ljava/util/Map$Entry<Ljava/lang/Integer;Ljava/lang/String;>;
// kotlin signature: ()?Ljet/MutableMap.MutableEntry<Ljava/lang/Integer;Ljava/lang/String;>; // kotlin signature: ()?Ljet/MutableMap.MutableEntry<Ljava/lang/Integer;Ljava/lang/String;>;
@@ -1,6 +1,6 @@
fun foo() = 1 fun foo() = 1
// method: namespace::foo // method: _DefaultPackage::foo
// jvm signature: ()I // jvm signature: ()I
// generic signature: null // generic signature: null
// kotlin signature: ()I // TODO: need to skip kotlin signature // kotlin signature: ()I // TODO: need to skip kotlin signature
+1 -1
View File
@@ -1,6 +1,6 @@
fun nothing(): Nothing = throw Exception() fun nothing(): Nothing = throw Exception()
// method: namespace::nothing // method: _DefaultPackage::nothing
// jvm signature: ()V // jvm signature: ()V
// generic signature: null // generic signature: null
// kotlin signature: ()Ljet/Nothing; // kotlin signature: ()Ljet/Nothing;
+1 -1
View File
@@ -1,6 +1,6 @@
fun nothingq(): Nothing? = null fun nothingq(): Nothing? = null
// method: namespace::nothingq // method: _DefaultPackage::nothingq
// jvm signature: ()Ljava/lang/Object; // jvm signature: ()Ljava/lang/Object;
// generic signature: null // generic signature: null
// kotlin signature: ()?Ljet/Nothing; // kotlin signature: ()?Ljet/Nothing;
@@ -1,6 +1,6 @@
fun foo(vararg tail: java.lang.CharSequence) = 1 fun foo(vararg tail: java.lang.CharSequence) = 1
// method: namespace::foo // method: _DefaultPackage::foo
// jvm signature: ([Ljava/lang/CharSequence;)I // jvm signature: ([Ljava/lang/CharSequence;)I
// generic signature: null // generic signature: null
// kotlin signature: ([Mjava/lang/CharSequence;)I // TODO: need to skip kotlin signature // kotlin signature: ([Mjava/lang/CharSequence;)I // TODO: need to skip kotlin signature
@@ -1,6 +1,6 @@
fun <P> foo(vararg tail: P) = 1 fun <P> foo(vararg tail: P) = 1
// method: namespace::foo // method: _DefaultPackage::foo
// jvm signature: ([Ljava/lang/Object;)I // jvm signature: ([Ljava/lang/Object;)I
// generic signature: <P:Ljava/lang/Object;>([TP;)I // generic signature: <P:Ljava/lang/Object;>([TP;)I
// kotlin signature: <erased P:?Ljava/lang/Object;>([TP;)I // kotlin signature: <erased P:?Ljava/lang/Object;>([TP;)I
@@ -4,7 +4,7 @@ class X
fun f(m: M<X, X>): M<X, X> = throw Exception() fun f(m: M<X, X>): M<X, X> = throw Exception()
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: (LM;)LM; // jvm signature: (LM;)LM;
// generic signature: (LM<-LX;+LX;>;)LM<LX;LX;>; // generic signature: (LM<-LX;+LX;>;)LM<LX;LX;>;
// kotlin signature: (LM<LX;LX;>;)LM<LX;LX;>; // kotlin signature: (LM<LX;LX;>;)LM<LX;LX;>;
@@ -2,7 +2,7 @@ class In<in T>
fun f(p: In<String>) {} fun f(p: In<String>) {}
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: (LIn;)V // jvm signature: (LIn;)V
// generic signature: (LIn<-Ljava/lang/String;>;)V // generic signature: (LIn<-Ljava/lang/String;>;)V
// kotlin signature: (LIn<Ljava/lang/String;>;)V // kotlin signature: (LIn<Ljava/lang/String;>;)V
@@ -2,7 +2,7 @@ class In<in T>
fun f(): In<String> = throw Exception() fun f(): In<String> = throw Exception()
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: ()LIn; // jvm signature: ()LIn;
// generic signature: ()LIn<Ljava/lang/String;>; // generic signature: ()LIn<Ljava/lang/String;>;
// kotlin signature: ()LIn<Ljava/lang/String;>; // kotlin signature: ()LIn<Ljava/lang/String;>;
@@ -3,7 +3,7 @@ class X
fun f(p: In<In<X>>) {} fun f(p: In<In<X>>) {}
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: (LIn;)V // jvm signature: (LIn;)V
// generic signature: (LIn<-LIn<-LX;>;>;)V // generic signature: (LIn<-LIn<-LX;>;>;)V
// kotlin signature: (LIn<LIn<LX;>;>;)V // kotlin signature: (LIn<LIn<LX;>;>;)V
@@ -3,7 +3,7 @@ class X
fun f(): In<In<X>> = throw Exception() fun f(): In<In<X>> = throw Exception()
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: ()LIn; // jvm signature: ()LIn;
// generic signature: ()LIn<LIn<-LX;>;>; // generic signature: ()LIn<LIn<-LX;>;>;
// kotlin signature: ()LIn<LIn<LX;>;>; // kotlin signature: ()LIn<LIn<LX;>;>;
@@ -4,7 +4,7 @@ class X
fun f(p: In<Out<X>>) {} fun f(p: In<Out<X>>) {}
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: (LIn;)V // jvm signature: (LIn;)V
// generic signature: (LIn<-LOut<+LX;>;>;)V // generic signature: (LIn<-LOut<+LX;>;>;)V
// kotlin signature: (LIn<LOut<LX;>;>;)V // kotlin signature: (LIn<LOut<LX;>;>;)V
@@ -4,7 +4,7 @@ class X
fun f(): In<Out<X>> = throw Exception() fun f(): In<Out<X>> = throw Exception()
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: ()LIn; // jvm signature: ()LIn;
// generic signature: ()LIn<LOut<+LX;>;>; // generic signature: ()LIn<LOut<+LX;>;>;
// kotlin signature: ()LIn<LOut<LX;>;>; // kotlin signature: ()LIn<LOut<LX;>;>;
@@ -1,6 +1,6 @@
fun f(p: List<String>) {} fun f(p: List<String>) {}
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: (Ljava/util/List;)V // jvm signature: (Ljava/util/List;)V
// generic signature: (Ljava/util/List<+Ljava/lang/String;>;)V // generic signature: (Ljava/util/List<+Ljava/lang/String;>;)V
// kotlin signature: (Ljet/List<Ljava/lang/String;>;)V // kotlin signature: (Ljet/List<Ljava/lang/String;>;)V
@@ -1,6 +1,6 @@
fun f(): List<String> = throw Exception() fun f(): List<String> = throw Exception()
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: ()Ljava/util/List; // jvm signature: ()Ljava/util/List;
// generic signature: ()Ljava/util/List<Ljava/lang/String;>; // generic signature: ()Ljava/util/List<Ljava/lang/String;>;
// kotlin signature: ()Ljet/List<Ljava/lang/String;>; // kotlin signature: ()Ljet/List<Ljava/lang/String;>;
@@ -4,7 +4,7 @@ class X
fun f(p: Out<In<X>>) {} fun f(p: Out<In<X>>) {}
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: (LOut;)V // jvm signature: (LOut;)V
// generic signature: (LOut<+LIn<-LX;>;>;)V // generic signature: (LOut<+LIn<-LX;>;>;)V
// kotlin signature: (LOut<LIn<LX;>;>;)V // kotlin signature: (LOut<LIn<LX;>;>;)V
@@ -4,7 +4,7 @@ class X
fun f(): Out<In<X>> = throw Exception() fun f(): Out<In<X>> = throw Exception()
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: ()LOut; // jvm signature: ()LOut;
// generic signature: ()LOut<LIn<-LX;>;>; // generic signature: ()LOut<LIn<-LX;>;>;
// kotlin signature: ()LOut<LIn<LX;>;>; // kotlin signature: ()LOut<LIn<LX;>;>;
@@ -3,7 +3,7 @@ class X
fun f(p: Out<Out<X>>) {} fun f(p: Out<Out<X>>) {}
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: (LOut;)V // jvm signature: (LOut;)V
// generic signature: (LOut<+LOut<+LX;>;>;)V // generic signature: (LOut<+LOut<+LX;>;>;)V
// kotlin signature: (LOut<LOut<LX;>;>;)V // kotlin signature: (LOut<LOut<LX;>;>;)V
@@ -13,7 +13,7 @@ class X
// thus removing the wildcard would be restricting the use of the return value of the method, and we don't want do this. // thus removing the wildcard would be restricting the use of the return value of the method, and we don't want do this.
fun f(): Out<Out<X>> = throw Exception() fun f(): Out<Out<X>> = throw Exception()
// method: namespace::f // method: _DefaultPackage::f
// jvm signature: ()LOut; // jvm signature: ()LOut;
// generic signature: ()LOut<LOut<+LX;>;>; // generic signature: ()LOut<LOut<+LX;>;>;
// kotlin signature: ()LOut<LOut<LX;>;>; // kotlin signature: ()LOut<LOut<LX;>;>;
@@ -3,7 +3,7 @@ class X
val p: M<X> = throw Exception() val p: M<X> = throw Exception()
// method: namespace::getP // method: _DefaultPackage::getP
// jvm signature: ()LM; // jvm signature: ()LM;
// generic signature: ()LM<LX;>; // generic signature: ()LM<LX;>;
// kotlin signature: null // kotlin signature: null
@@ -3,7 +3,7 @@ class X
val p: M<X> = throw Exception() val p: M<X> = throw Exception()
// method: namespace::getP // method: _DefaultPackage::getP
// jvm signature: ()LM; // jvm signature: ()LM;
// generic signature: ()LM<LX;>; // generic signature: ()LM<LX;>;
// kotlin signature: null // kotlin signature: null
@@ -3,7 +3,7 @@ class X
val p: M<X, X> = throw Exception() val p: M<X, X> = throw Exception()
// method: namespace::getP // method: _DefaultPackage::getP
// jvm signature: ()LM; // jvm signature: ()LM;
// generic signature: ()LM<LX;LX;>; // generic signature: ()LM<LX;LX;>;
// kotlin signature: null // kotlin signature: null
@@ -3,7 +3,7 @@ class X
var p: M<X> = throw Exception() var p: M<X> = throw Exception()
// method: namespace::setP // method: _DefaultPackage::setP
// jvm signature: (LM;)V // jvm signature: (LM;)V
// generic signature: (LM<-LX;>;)V // generic signature: (LM<-LX;>;)V
// kotlin signature: null // kotlin signature: null
@@ -3,7 +3,7 @@ class X
var p: M<X> = throw Exception() var p: M<X> = throw Exception()
// method: namespace::setP // method: _DefaultPackage::setP
// jvm signature: (LM;)V // jvm signature: (LM;)V
// generic signature: (LM<+LX;>;)V // generic signature: (LM<+LX;>;)V
// kotlin signature: null // kotlin signature: null
+1 -1
View File
@@ -1,6 +1,6 @@
fun string(): java.lang.String = throw Exception() fun string(): java.lang.String = throw Exception()
// method: namespace::string // method: _DefaultPackage::string
// jvm signature: ()Ljava/lang/String; // jvm signature: ()Ljava/lang/String;
// generic signature: null // generic signature: null
// kotlin signature: ()Mjava/lang/String; // kotlin signature: ()Mjava/lang/String;
@@ -0,0 +1,104 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.*;
public class PackageClassNameTest {
@Test
public void testPackageName1() {
doTest("kotlin", "KotlinPackage", "_DefaultPackage");
}
@Test
public void testPackageName2() {
doTest("kotlin.io", "IoPackage", "KotlinPackage");
}
@Test
public void testPackageName3() {
doTest("kotlin.io.foo", "FooPackage", "IoPackage");
}
@Test
public void testPackageName4() {
doTest("kotlinTest.ioTest", "IoTestPackage", "KotlinTestPackage");
}
@Test
public void testPackageName5() {
doTest(FqName.ROOT, "_DefaultPackage", null);
}
@Test
public void testPackageName6() {
doTest(FqName.ROOT.child(Name.identifier("kotlin")), "KotlinPackage", "_DefaultPackage");
}
@Test
public void testIsPackageClass1() {
doTestIsPackageClass("", true);
}
@Test
public void testIsPackageClass2() {
doTestIsPackageClass("kotlin", false);
}
@Test
public void testIsPackageClass3() {
doTestIsPackageClass("kotlin.KotlinPackage", true);
}
@Test
public void testIsPackageClass4() {
doTestIsPackageClass("kotlin.test.SomeClass", false);
}
@Test
public void testIsPackageClass5() {
doTestIsPackageClass("kotlin.io.IoPackage", true);
}
@Test
public void testInnerIsPackage() {
doTestIsPackageClass("kotlin.io.IoPackage$Foo", false);
}
private void doTest(@NotNull String name, @NotNull String expectedForChild, @Nullable String expectedForParent) {
doTest(new FqName(name), expectedForChild, expectedForParent);
}
private void doTest(@NotNull FqName name, @NotNull String expectedForChild, @Nullable String expectedForParent) {
assertEquals("Wrong result for child [" + name + "].", expectedForChild, getPackageClassName(name));
if (expectedForParent != null) {
assertEquals("Wrong result for parent [" + name + "].", expectedForParent, getPackageClassName(name.parent()));
}
}
private void doTestIsPackageClass(String testedName, boolean expected) {
assertEquals("Wrong result for [" + testedName + "].", expected, isPackageClass(new FqName(testedName)));
}
}
@@ -32,8 +32,10 @@ import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.config.CommonConfigurationKeys; import org.jetbrains.jet.config.CommonConfigurationKeys;
import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment; import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment;
import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil; import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.Arrays;
@@ -126,7 +128,7 @@ public abstract class KotlinLightClassTest extends KotlinTestWithEnvironment {
} }
public void testPackage() throws Exception { public void testPackage() throws Exception {
checkModifiers("test.namespace", PUBLIC, FINAL); checkModifiers("test." + PackageClassUtils.getPackageClassName(new FqName("test")), PUBLIC, FINAL);
} }
} }
@@ -25,6 +25,8 @@ import org.jetbrains.jet.cli.common.ExitCode;
import org.jetbrains.jet.cli.jvm.compiler.KotlinToJVMBytecodeCompiler; import org.jetbrains.jet.cli.jvm.compiler.KotlinToJVMBytecodeCompiler;
import org.jetbrains.jet.lang.parsing.JetScriptDefinition; import org.jetbrains.jet.lang.parsing.JetScriptDefinition;
import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.ref.JetTypeName; import org.jetbrains.jet.lang.types.ref.JetTypeName;
import org.jetbrains.jet.test.Tmpdir; import org.jetbrains.jet.test.Tmpdir;
@@ -101,7 +103,7 @@ public class CliTest {
"-output", tmpdir.getTmpDir().getPath()}; "-output", tmpdir.getTmpDir().getPath()};
executeCompilerCompareOutput(args); executeCompilerCompareOutput(args);
Assert.assertTrue(new File(tmpdir.getTmpDir(), "namespace.class").isFile()); Assert.assertTrue(new File(tmpdir.getTmpDir(), PackageClassUtils.getPackageClassName(FqName.ROOT) + ".class").isFile());
} }
@Test @Test
@@ -33,29 +33,29 @@ public class CheckLocalVariablesTableTestGenerated extends AbstractCheckLocalVar
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/checkLocalVariablesTable"), "kt", true); JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/checkLocalVariablesTable"), "kt", true);
} }
@TestMetadata("namespace$foo$1.kt")
public void testNamespace$foo$1() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/namespace$foo$1.kt");
}
@TestMetadata("namespace$foo$1$1.kt")
public void testNamespace$foo$1$1() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/namespace$foo$1$1.kt");
}
@TestMetadata("namespace$foo$a$1.kt")
public void testNamespace$foo$a$1() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/namespace$foo$a$1.kt");
}
@TestMetadata("namespace$foo1$1.kt")
public void testNamespace$foo1$1() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/namespace$foo1$1.kt");
}
@TestMetadata("someClass.kt") @TestMetadata("someClass.kt")
public void testSomeClass() throws Exception { public void testSomeClass() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/someClass.kt"); doTest("compiler/testData/checkLocalVariablesTable/someClass.kt");
} }
@TestMetadata("_DefaultPackage$foo$1.kt")
public void test_DefaultPackage$foo$1() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/_DefaultPackage$foo$1.kt");
}
@TestMetadata("_DefaultPackage$foo$1$1.kt")
public void test_DefaultPackage$foo$1$1() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/_DefaultPackage$foo$1$1.kt");
}
@TestMetadata("_DefaultPackage$foo$a$1.kt")
public void test_DefaultPackage$foo$a$1() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/_DefaultPackage$foo$a$1.kt");
}
@TestMetadata("_DefaultPackage$foo1$1.kt")
public void test_DefaultPackage$foo1$1() throws Exception {
doTest("compiler/testData/checkLocalVariablesTable/_DefaultPackage$foo1$1.kt");
}
} }
@@ -17,6 +17,8 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import org.jetbrains.jet.ConfigurationKind; import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@@ -60,7 +62,7 @@ public class ClassGenTest extends CodegenTestCase {
// System.out.println(generateToText()); // System.out.println(generateToText());
final ClassFileFactory state = generateClassesInFile(); final ClassFileFactory state = generateClassesInFile();
final GeneratedClassLoader loader = createClassLoader(state); final GeneratedClassLoader loader = createClassLoader(state);
final Class aClass = loader.loadClass("namespace"); final Class aClass = loader.loadClass(PackageClassUtils.getPackageClassName(FqName.ROOT));
assertEquals("OK", aClass.getMethod("box").invoke(null)); assertEquals("OK", aClass.getMethod("box").invoke(null));
final Class test = loader.loadClass("Test"); final Class test = loader.loadClass("Test");
@@ -29,6 +29,8 @@ import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import java.io.File; import java.io.File;
@@ -69,7 +71,7 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
loadFiles("notNullAssertions/noAssertionsForKotlin.kt", "notNullAssertions/noAssertionsForKotlinMain.kt"); loadFiles("notNullAssertions/noAssertionsForKotlin.kt", "notNullAssertions/noAssertionsForKotlinMain.kt");
assertNoIntrinsicsMethodIsCalled("namespace"); assertNoIntrinsicsMethodIsCalled(PackageClassUtils.getPackageClassName(FqName.ROOT));
} }
public void testNoAssertionsForKotlinFromBinary() throws Exception { public void testNoAssertionsForKotlinFromBinary() throws Exception {
@@ -85,7 +87,7 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
loadFile("notNullAssertions/noAssertionsForKotlinMain.kt"); loadFile("notNullAssertions/noAssertionsForKotlinMain.kt");
assertNoIntrinsicsMethodIsCalled("namespace"); assertNoIntrinsicsMethodIsCalled(PackageClassUtils.getPackageClassName(FqName.ROOT));
} }
public void testGenerateParamAssertions() throws Exception { public void testGenerateParamAssertions() throws Exception {
@@ -30,7 +30,8 @@ import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.parsing.JetParsingTest; import org.jetbrains.jet.parsing.JetParsingTest;
import org.jetbrains.jet.test.TestCaseWithTmpdir; import org.jetbrains.jet.test.TestCaseWithTmpdir;
import org.jetbrains.jet.utils.ExceptionUtils; import org.jetbrains.jet.utils.ExceptionUtils;
@@ -326,7 +327,7 @@ public class LineNumberTest extends TestCaseWithTmpdir {
JetFile foo = createPsiFile("staticDelegate/foo.kt"); JetFile foo = createPsiFile("staticDelegate/foo.kt");
JetFile bar = createPsiFile("staticDelegate/bar.kt"); JetFile bar = createPsiFile("staticDelegate/bar.kt");
GenerationState state = GenerationUtils.compileManyFilesGetGenerationStateForTest(foo.getProject(), Arrays.asList(foo, bar)); GenerationState state = GenerationUtils.compileManyFilesGetGenerationStateForTest(foo.getProject(), Arrays.asList(foo, bar));
ClassReader reader = new ClassReader(state.getFactory().asBytes(JvmAbi.PACKAGE_CLASS + ".class")); ClassReader reader = new ClassReader(state.getFactory().asBytes(PackageClassUtils.getPackageClassName(FqName.ROOT) + ".class"));
// There must be exactly one line number attribute for each static delegate in namespace.class, and it should point to the first // There must be exactly one line number attribute for each static delegate in namespace.class, and it should point to the first
// line. There are two static delegates in this test, hence the [1, 1] // line. There are two static delegates in this test, hence the [1, 1]
@@ -30,6 +30,8 @@ import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils; import org.jetbrains.jet.codegen.GenerationUtils;
import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.test.TestCaseWithTmpdir; import org.jetbrains.jet.test.TestCaseWithTmpdir;
import java.io.File; import java.io.File;
@@ -62,7 +64,7 @@ public abstract class AbstractCompileKotlinAgainstKotlinTest extends TestCaseWit
new URL[]{ aDir.toURI().toURL(), bDir.toURI().toURL() }, new URL[]{ aDir.toURI().toURL(), bDir.toURI().toURL() },
AbstractCompileKotlinAgainstKotlinTest.class.getClassLoader() AbstractCompileKotlinAgainstKotlinTest.class.getClassLoader()
); );
Class<?> clazz = classLoader.loadClass("namespace"); Class<?> clazz = classLoader.loadClass(PackageClassUtils.getPackageClassName(FqName.ROOT));
Method main = clazz.getMethod("main", new Class[] {String[].class}); Method main = clazz.getMethod("main", new Class[] {String[].class});
main.invoke(null, new Object[] {ArrayUtil.EMPTY_STRING_ARRAY}); main.invoke(null, new Object[] {ArrayUtil.EMPTY_STRING_ARRAY});
} }
@@ -22,6 +22,8 @@ import org.jetbrains.jet.cli.common.ExitCode;
import org.jetbrains.jet.cli.jvm.K2JVMCompiler; import org.jetbrains.jet.cli.jvm.K2JVMCompiler;
import org.jetbrains.jet.codegen.forTestCompile.ForTestPackJdkAnnotations; import org.jetbrains.jet.codegen.forTestCompile.ForTestPackJdkAnnotations;
import org.jetbrains.jet.codegen.forTestCompile.ForTestCompileRuntime; import org.jetbrains.jet.codegen.forTestCompile.ForTestCompileRuntime;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.parsing.JetParsingTest; import org.jetbrains.jet.parsing.JetParsingTest;
import org.junit.Assert; import org.junit.Assert;
@@ -55,7 +57,7 @@ public class CompileEnvironmentTest extends TestCase {
JarInputStream is = new JarInputStream(fileInputStream); JarInputStream is = new JarInputStream(fileInputStream);
try { try {
final List<String> entries = listEntries(is); final List<String> entries = listEntries(is);
assertTrue(entries.contains("Smoke/namespace.class")); assertTrue(entries.contains("Smoke/" + PackageClassUtils.getPackageClassName(new FqName("Smoke")) + ".class"));
assertEquals(1, entries.size()); assertEquals(1, entries.size());
} }
finally { finally {
@@ -29,8 +29,8 @@ import jet.runtime.typeinfo.JetClass;
import jet.runtime.typeinfo.JetValueParameter; import jet.runtime.typeinfo.JetValueParameter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
import org.jetbrains.jet.lang.resolve.java.kt.JetValueParameterAnnotation; import org.jetbrains.jet.lang.resolve.java.kt.JetValueParameterAnnotation;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -57,7 +57,8 @@ class JetFromJavaDescriptorHelper {
/* Will iterate through short name caches /* Will iterate through short name caches
Kotlin namespaces from jar a class files will be collected from java cache Kotlin namespaces from jar a class files will be collected from java cache
Kotlin namespaces classes from sources will be collected with JetShortNamesCache.getClassesByName */ Kotlin namespaces classes from sources will be collected with JetShortNamesCache.getClassesByName */
return PsiShortNamesCache.getInstance(project).getClassesByName(JvmAbi.PACKAGE_CLASS, scope); // TODO Collect all package classes
return PsiShortNamesCache.getInstance(project).getClassesByName("namespace", scope);
} }
/** /**
@@ -160,7 +161,7 @@ class JetFromJavaDescriptorHelper {
FqName classFQN = new FqName(qualifiedName); FqName classFQN = new FqName(qualifiedName);
if (classFQN.shortName().toString().equals(JvmAbi.PACKAGE_CLASS)) { if (PackageClassUtils.isPackageClass(classFQN)) {
FqName classParentFQN = QualifiedNamesUtil.withoutLastSegment(classFQN); FqName classParentFQN = QualifiedNamesUtil.withoutLastSegment(classFQN);
return QualifiedNamesUtil.combine(classParentFQN, Name.identifier(method.getName())); return QualifiedNamesUtil.combine(classParentFQN, Name.identifier(method.getName()));
} }
@@ -183,7 +184,7 @@ class JetFromJavaDescriptorHelper {
// Check this is top level function // Check this is top level function
PsiClass containingClass = psiMethod.getContainingClass(); PsiClass containingClass = psiMethod.getContainingClass();
if (containingClass == null || !JvmAbi.PACKAGE_CLASS.equals(containingClass.getName())) { if (containingClass == null || !PackageClassUtils.isPackageClass(containingClass)) {
continue; continue;
} }
@@ -28,6 +28,7 @@ import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.util.ArrayUtil; import com.intellij.util.ArrayUtil;
import com.intellij.util.Processor; import com.intellij.util.Processor;
import com.intellij.util.containers.HashSet; import com.intellij.util.containers.HashSet;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -46,6 +47,7 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils;
import org.jetbrains.jet.plugin.caches.resolve.IDELightClassGenerationSupport;
import org.jetbrains.jet.plugin.stubindex.*; import org.jetbrains.jet.plugin.stubindex.*;
import java.util.*; import java.util.*;
@@ -81,8 +83,12 @@ public class JetShortNamesCache extends PsiShortNamesCache {
@Override @Override
public String[] getAllClassNames() { public String[] getAllClassNames() {
Collection<String> classNames = JetShortClassNameIndex.getInstance().getAllKeys(project); Collection<String> classNames = JetShortClassNameIndex.getInstance().getAllKeys(project);
// .namespace classes can not be indexed, since they have no explicit declarations // .namespace classes can not be indexed, since they have no explicit declarations
classNames.add(JvmAbi.PACKAGE_CLASS); IDELightClassGenerationSupport lightClassGenerationSupport = IDELightClassGenerationSupport.getInstanceForIDE(project);
Set<String> packageClassShortNames = lightClassGenerationSupport.getAllPackageClasses(GlobalSearchScope.allScope(project)).keySet();
classNames.addAll(packageClassShortNames);
return ArrayUtil.toStringArray(classNames); return ArrayUtil.toStringArray(classNames);
} }
@@ -94,11 +100,14 @@ public class JetShortNamesCache extends PsiShortNamesCache {
public PsiClass[] getClassesByName(@NotNull @NonNls String name, @NotNull GlobalSearchScope scope) { public PsiClass[] getClassesByName(@NotNull @NonNls String name, @NotNull GlobalSearchScope scope) {
List<PsiClass> result = new ArrayList<PsiClass>(); List<PsiClass> result = new ArrayList<PsiClass>();
if (JvmAbi.PACKAGE_CLASS.equals(name)) { IDELightClassGenerationSupport lightClassGenerationSupport = IDELightClassGenerationSupport.getInstanceForIDE(project);
// .namespace classes can not be indexed, since they have no explicit declarations MultiMap<String, FqName> packageClasses = lightClassGenerationSupport.getAllPackageClasses(scope);
Collection<String> allPackageFqNames = JetPackageDeclarationIndex.getInstance().getAllKeys(project);
for (String fqName : allPackageFqNames) { // .namespace classes can not be indexed, since they have no explicit declarations
PsiClass psiClass = JavaElementFinder.getInstance(project).findClass(fqName + "." + JvmAbi.PACKAGE_CLASS, scope); Collection<FqName> fqNames = packageClasses.get(name);
if (!fqNames.isEmpty()) {
for (FqName fqName : fqNames) {
PsiClass psiClass = JavaElementFinder.getInstance(project).findClass(fqName.getFqName(), scope);
if (psiClass != null) { if (psiClass != null) {
result.add(psiClass); result.add(psiClass);
} }
@@ -17,14 +17,17 @@
package org.jetbrains.jet.plugin.caches.resolve; package org.jetbrains.jet.plugin.caches.resolve;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.asJava.LightClassConstructionContext; import org.jetbrains.jet.asJava.LightClassConstructionContext;
import org.jetbrains.jet.asJava.LightClassGenerationSupport; import org.jetbrains.jet.asJava.LightClassGenerationSupport;
import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetClassOrObject;
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.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.stubindex.*; import org.jetbrains.jet.plugin.stubindex.*;
import org.jetbrains.jet.util.QualifiedNamesUtil; import org.jetbrains.jet.util.QualifiedNamesUtil;
@@ -36,6 +39,10 @@ import static org.jetbrains.jet.plugin.stubindex.JetSourceFilterScope.kotlinSour
public class IDELightClassGenerationSupport extends LightClassGenerationSupport { public class IDELightClassGenerationSupport extends LightClassGenerationSupport {
public static IDELightClassGenerationSupport getInstanceForIDE(@NotNull Project project) {
return (IDELightClassGenerationSupport) ServiceManager.getService(project, LightClassGenerationSupport.class);
}
private final Project project; private final Project project;
public IDELightClassGenerationSupport(@NotNull Project project) { public IDELightClassGenerationSupport(@NotNull Project project) {
@@ -96,4 +103,20 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
return result; return result;
} }
@NotNull
public MultiMap<String, FqName> getAllPackageClasses(@NotNull final GlobalSearchScope scope) {
Collection<String> packageFqNames = JetPackageDeclarationIndex.getInstance().getAllKeys(project);
MultiMap<String, FqName> result = new MultiMap<String, FqName>();
for (String packageFqName : packageFqNames) {
Collection<JetFile> files = JetPackageDeclarationIndex.getInstance().get(packageFqName, project, kotlinSources(scope));
if (!files.isEmpty()) {
FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(new FqName(packageFqName));
result.putValue(packageClassFqName.shortName().getName(), packageClassFqName);
}
}
return result;
}
} }
@@ -25,7 +25,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper; import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper;
@@ -190,7 +190,7 @@ public class JetImportOptimizer implements ImportOptimizer {
if (element instanceof JetFile) { if (element instanceof JetFile) {
return JetPsiUtil.getFQName((JetFile) element); return JetPsiUtil.getFQName((JetFile) element);
} }
if (element instanceof JetSimpleNameExpression) { if (element instanceof JetSimpleNameExpression) {
JetNamespaceHeader namespaceHeader = PsiTreeUtil.getParentOfType(element, JetNamespaceHeader.class); JetNamespaceHeader namespaceHeader = PsiTreeUtil.getParentOfType(element, JetNamespaceHeader.class);
if (namespaceHeader != null) { if (namespaceHeader != null) {
@@ -221,7 +221,7 @@ public class JetImportOptimizer implements ImportOptimizer {
return new FqName(qualifiedName); return new FqName(qualifiedName);
} }
} }
if (element instanceof PsiField) { if (element instanceof PsiField) {
PsiField field = (PsiField) element; PsiField field = (PsiField) element;
@@ -260,7 +260,7 @@ public class JetImportOptimizer implements ImportOptimizer {
if (memberName == null) { if (memberName == null) {
return null; return null;
} }
if (classFQN.shortName().getName().equals(JvmAbi.PACKAGE_CLASS)) { if (PackageClassUtils.isPackageClass(classFQN)) {
return QualifiedNamesUtil.combine(classFQN.parent(), Name.identifier(memberName)); return QualifiedNamesUtil.combine(classFQN.parent(), Name.identifier(memberName));
} }
else { else {
@@ -26,8 +26,10 @@ import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.caches.resolve.IDELightClassGenerationSupport;
import org.jetbrains.jet.plugin.util.DebuggerUtils; import org.jetbrains.jet.plugin.util.DebuggerUtils;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@@ -55,10 +57,8 @@ public class JetExceptionFilter implements Filter {
// fullyQualifiedName is of format "package.Class$Inner" // fullyQualifiedName is of format "package.Class$Inner"
String fullyQualifiedName = element.getClassName(); String fullyQualifiedName = element.getClassName();
int lastDot = fullyQualifiedName.lastIndexOf('.');
String classNameWithInners = fullyQualifiedName.substring(lastDot + 1);
// All classes except 'namespace' and its inner classes are handled correctly in the default ExceptionFilter // All classes except 'namespace' and its inner classes are handled correctly in the default ExceptionFilter
if (!classNameWithInners.equals(JvmAbi.PACKAGE_CLASS) && !classNameWithInners.startsWith(JvmAbi.PACKAGE_CLASS + "$")) { if (!isPackageClassOrSubClass(fullyQualifiedName)) {
return null; return null;
} }
@@ -74,6 +74,20 @@ public class JetExceptionFilter implements Filter {
return new OpenFileHyperlinkInfo(project, virtualFile, element.getLineNumber() - 1); return new OpenFileHyperlinkInfo(project, virtualFile, element.getLineNumber() - 1);
} }
private boolean isPackageClassOrSubClass(String fqName) {
if (fqName.equals(PackageClassUtils.getPackageClassName(FqName.ROOT))) {
return true;
}
int lastDot = fqName.lastIndexOf('.');
String classNameWithInners = fqName.substring(lastDot + 1);
int firstDollar = classNameWithInners.indexOf('$');
String className = firstDollar >= 0 ? classNameWithInners.substring(0, firstDollar) : classNameWithInners;
String packageClassName = PackageClassUtils.getPackageClassName(new FqName(fqName).parent());
return packageClassName.equals(className);
}
// Matches strings like "\tat test.namespace$foo$f$1.invoke(a.kt:3)\n" // Matches strings like "\tat test.namespace$foo$f$1.invoke(a.kt:3)\n"
private static final Pattern STACK_TRACE_ELEMENT_PATTERN = Pattern.compile("^\\s*at\\s+(.+)\\.(.+)\\((.+):(\\d+)\\)\\s*$"); private static final Pattern STACK_TRACE_ELEMENT_PATTERN = Pattern.compile("^\\s*at\\s+(.+)\\.(.+)\\((.+):(\\d+)\\)\\s*$");
@@ -33,10 +33,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.MemberComparator; import org.jetbrains.jet.lang.resolve.MemberComparator;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
@@ -236,7 +233,7 @@ public class DecompiledDataFactory {
} }
public static boolean isKotlinNamespaceClass(@NotNull PsiClass psiClass) { public static boolean isKotlinNamespaceClass(@NotNull PsiClass psiClass) {
if (JvmAbi.PACKAGE_CLASS.equals(psiClass.getName()) && !isKotlinClass(psiClass)) { if (PackageClassUtils.isPackageClass(psiClass) && !isKotlinClass(psiClass)) {
for (PsiMethod method : psiClass.getMethods()) { for (PsiMethod method : psiClass.getMethods()) {
if (hasAnnotation(method, JET_METHOD)) { if (hasAnnotation(method, JET_METHOD)) {
return true; return true;
@@ -29,7 +29,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
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.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.plugin.JetMainDetector; import org.jetbrains.jet.plugin.JetMainDetector;
@@ -76,7 +76,7 @@ public class JetRunConfigurationProducer extends RuntimeConfigurationProducer im
if (JetMainDetector.hasMain(jetFile.getDeclarations())) { if (JetMainDetector.hasMain(jetFile.getDeclarations())) {
mySourceElement = jetFile; mySourceElement = jetFile;
FqName fqName = JetPsiUtil.getFQName(jetFile); FqName fqName = JetPsiUtil.getFQName(jetFile);
return fqName.child(Name.identifier(JvmAbi.PACKAGE_CLASS)); return PackageClassUtils.getPackageClassFqName(fqName);
} }
} }
@@ -93,7 +93,7 @@ public class JetRunConfigurationProducer extends RuntimeConfigurationProducer im
RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(module.getProject(), context); RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(module.getProject(), context);
JetRunConfiguration configuration = (JetRunConfiguration) settings.getConfiguration(); JetRunConfiguration configuration = (JetRunConfiguration) settings.getConfiguration();
configuration.setModule(module); configuration.setModule(module);
configuration.setName(StringUtil.trimEnd(fqName.getFqName(), "." + JvmAbi.PACKAGE_CLASS)); configuration.setName(StringUtil.trimEnd(fqName.getFqName(), "." + PackageClassUtils.getPackageClassName(fqName)));
configuration.setRunClass(fqName.getFqName()); configuration.setRunClass(fqName.getFqName());
return settings; return settings;
} }
@@ -5,5 +5,5 @@ public class Testing {
} }
// EXIST: ClassFromJet // EXIST: ClassFromJet
// EXIST: namespace // EXIST: SomePackage
// NUMBER: 2 // NUMBER: 2
@@ -1,6 +1,6 @@
public class Testing { public class Testing {
public static void main(String[] args) { public static void main(String[] args) {
kotlin.testing.namespace.<caret> kotlin.testing.TestingPackage.<caret>
} }
} }
@@ -0,0 +1,3 @@
fun foo() {
"" // _DefaultPackage
}
+1 -1
View File
@@ -4,5 +4,5 @@ class A {
} }
fun A.foo() { fun A.foo() {
"" // a/namespace "" // a/APackage
} }

Some files were not shown because too many files have changed in this diff Show More