From 43d64f2265e531423685ce20348ca43ae5627972 Mon Sep 17 00:00:00 2001 From: Daniel Penkin Date: Wed, 9 May 2012 13:58:40 +0400 Subject: [PATCH 01/88] Uncommented invoker plugin but commented phase binding. Integration tests are not held during normal package but still available via "mvn integration-test" command. --- libraries/tools/kotlin-maven-plugin/pom.xml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libraries/tools/kotlin-maven-plugin/pom.xml b/libraries/tools/kotlin-maven-plugin/pom.xml index f7170466c65..a5f5e327dac 100644 --- a/libraries/tools/kotlin-maven-plugin/pom.xml +++ b/libraries/tools/kotlin-maven-plugin/pom.xml @@ -56,7 +56,6 @@ 2.9 - + ${project.build.directory}/local-repo verify.bsh integration-test - package + install run @@ -82,7 +81,6 @@ - --> From 162cc7307dcc6fadd84caac77b4f08fed70bfc94 Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Fri, 11 May 2012 12:52:26 +0400 Subject: [PATCH 02/88] KT-1935 Fixed: ACC_SUPER flag must be set for classes --- .../codegen/ImplementationBodyCodegen.java | 3 + .../Foo$publicFinalInnerClass.kt | 12 ++ .../Foo$publicInnerInterface.kt | 12 ++ .../writeAccessFlags/publicFinalClass.kt | 10 + .../writeAccessFlags/publicInterface.kt | 10 + .../jet/codegen/WriteAccessFlagsTest.java | 201 ++++++++++++++++++ 6 files changed, 248 insertions(+) create mode 100644 compiler/testData/writeAccessFlags/Foo$publicFinalInnerClass.kt create mode 100644 compiler/testData/writeAccessFlags/Foo$publicInnerInterface.kt create mode 100644 compiler/testData/writeAccessFlags/publicFinalClass.kt create mode 100644 compiler/testData/writeAccessFlags/publicInterface.kt create mode 100644 compiler/tests/org/jetbrains/jet/codegen/WriteAccessFlagsTest.java diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index c9475688601..eeab96e059c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -105,6 +105,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (isInterface) { access |= ACC_INTERFACE; // ACC_SUPER } + else { + access |= ACC_SUPER; + } if (isFinal) { access |= ACC_FINAL; } diff --git a/compiler/testData/writeAccessFlags/Foo$publicFinalInnerClass.kt b/compiler/testData/writeAccessFlags/Foo$publicFinalInnerClass.kt new file mode 100644 index 00000000000..2f8dc09ccea --- /dev/null +++ b/compiler/testData/writeAccessFlags/Foo$publicFinalInnerClass.kt @@ -0,0 +1,12 @@ +public class Foo() { + public class publicFinalInnerClass() { + } +} + +// ACC_ABSTRACT : false +// ACC_ANNOTATION : false +// ACC_FINAL : true +// ACC_INTERFACE : false +// ACC_PUBLIC : true +// ACC_STATIC : false +// ACC_SUPER : true \ No newline at end of file diff --git a/compiler/testData/writeAccessFlags/Foo$publicInnerInterface.kt b/compiler/testData/writeAccessFlags/Foo$publicInnerInterface.kt new file mode 100644 index 00000000000..e7f7f92265a --- /dev/null +++ b/compiler/testData/writeAccessFlags/Foo$publicInnerInterface.kt @@ -0,0 +1,12 @@ +public class Foo() { + public trait publicInnerInterface { + } +} + +// ACC_ABSTRACT : true +// ACC_ANNOTATION : false +// ACC_FINAL : false +// ACC_INTERFACE : true +// ACC_PUBLIC : true +// ACC_STATIC : false +// ACC_SUPER : false \ No newline at end of file diff --git a/compiler/testData/writeAccessFlags/publicFinalClass.kt b/compiler/testData/writeAccessFlags/publicFinalClass.kt new file mode 100644 index 00000000000..ca5c373ba8e --- /dev/null +++ b/compiler/testData/writeAccessFlags/publicFinalClass.kt @@ -0,0 +1,10 @@ +public class publicFinalClass() { +} + +// ACC_ABSTRACT : false +// ACC_ANNOTATION : false +// ACC_FINAL : true +// ACC_INTERFACE : false +// ACC_PUBLIC : true +// ACC_STATIC : false +// ACC_SUPER : true \ No newline at end of file diff --git a/compiler/testData/writeAccessFlags/publicInterface.kt b/compiler/testData/writeAccessFlags/publicInterface.kt new file mode 100644 index 00000000000..9a3a02336fa --- /dev/null +++ b/compiler/testData/writeAccessFlags/publicInterface.kt @@ -0,0 +1,10 @@ +public trait publicInterface { +} + +// ACC_ABSTRACT : true +// ACC_ANNOTATION : false +// ACC_FINAL : false +// ACC_INTERFACE : true +// ACC_PUBLIC : true +// ACC_STATIC : false +// ACC_SUPER : false \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/WriteAccessFlagsTest.java b/compiler/tests/org/jetbrains/jet/codegen/WriteAccessFlagsTest.java new file mode 100644 index 00000000000..5a4b391e295 --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/codegen/WriteAccessFlagsTest.java @@ -0,0 +1,201 @@ +/* + * Copyright 2010-2012 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.codegen; + +import com.google.common.io.Files; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.psi.PsiFileFactory; +import com.intellij.psi.impl.PsiFileFactoryImpl; +import com.intellij.testFramework.LightVirtualFile; +import junit.framework.Test; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetTestCaseBuilder; +import org.jetbrains.jet.JetTestUtils; +import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; +import org.jetbrains.jet.cli.jvm.compiler.TestCaseWithTmpdir; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; +import org.jetbrains.jet.plugin.JetLanguage; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.Opcodes; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Test correctness of written access flags in class file + * + * @author Natalia.Ukhorskaya + */ +public class WriteAccessFlagsTest extends TestCaseWithTmpdir { + + private final File ktFile; + private JetCoreEnvironment jetCoreEnvironment; + + public WriteAccessFlagsTest(File ktFile) { + this.ktFile = ktFile; + } + + @Override + public String getName() { + return ktFile.getName(); + } + + @Override + protected void runTest() throws Throwable { + jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable); + + String text = FileUtil.loadFile(ktFile); + + LightVirtualFile virtualFile = new LightVirtualFile(ktFile.getName(), JetLanguage.INSTANCE, text); + virtualFile.setCharset(CharsetToolkit.UTF8_CHARSET); + JetFile psiFile = (JetFile) ((PsiFileFactoryImpl) PsiFileFactory.getInstance(jetCoreEnvironment.getProject())) + .trySetupPsiForFile(virtualFile, JetLanguage.INSTANCE, true, false); + assert psiFile != null; + + final ClassFileFactory factory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile, CompilerSpecialMode.REGULAR); + + String modifiedTestName = this.getName().replace(".kt", ".class"); + boolean isClassFound = false; + for (String filename : factory.files()) { + if (filename.equals(modifiedTestName)) { + isClassFound = true; + ClassReader cr = new ClassReader(factory.asBytes(filename)); + final Expectation expectation = parseExpectations(); + int expectedAccess = 0; + if (expectation.isAbstract) { + expectedAccess |= Opcodes.ACC_ABSTRACT; + } + if (expectation.isAnnotation) { + expectedAccess |= Opcodes.ACC_ANNOTATION; + } + if (expectation.isFinal) { + expectedAccess |= Opcodes.ACC_FINAL; + } + if (expectation.isPublic) { + expectedAccess |= Opcodes.ACC_PUBLIC; + } + if (expectation.isInterface) { + expectedAccess |= Opcodes.ACC_INTERFACE; + } + if (expectation.isStatic) { + expectedAccess |= Opcodes.ACC_STATIC; + } + if (expectation.isSuper) { + expectedAccess |= Opcodes.ACC_SUPER; + } + + assertEquals("Wrong access flag", expectedAccess, cr.getAccess()); + } + } + + if (!isClassFound) { + throw new AssertionError("file name should be the same as class name. File name is " + modifiedTestName); + } + + Disposer.dispose(myTestRootDisposable); + } + + + public static Test suite() { + return JetTestCaseBuilder.suiteForDirectory(JetTestCaseBuilder.getTestDataPathBase(), "/writeAccessFlags", true, + new JetTestCaseBuilder.NamedTestFactory() { + @NotNull + @Override + public Test createTest(@NotNull String dataPath, + @NotNull String name, + @NotNull File file) { + return new WriteAccessFlagsTest(file); + } + }); + } + + private static class Expectation { + private final boolean isAbstract; + private final boolean isAnnotation; + private final boolean isFinal; + private final boolean isInterface; + private final boolean isPublic; + private final boolean isStatic; + private final boolean isSuper; + + private Expectation(@NotNull String isAbstract, + @NotNull String isAnnotation, + @NotNull String isFinal, + @NotNull String isInterface, + @NotNull String isPublic, + @NotNull String isStatic, + @NotNull String isSuper) { + this.isAbstract = isAbstract.equals("true"); + this.isAnnotation = isAnnotation.equals("true"); + this.isFinal = isFinal.equals("true"); + this.isPublic = isPublic.equals("true"); + this.isInterface = isInterface.equals("true"); + this.isStatic = isStatic.equals("true"); + this.isSuper = isSuper.equals("true"); + } + } + + @NotNull + private static final Pattern isAbstract = Pattern.compile("^// ACC_ABSTRACT : *(.*)"); + private static final Pattern isAnnotation = Pattern.compile("^// ACC_ANNOTATION : *(.*)"); + private static final Pattern isFinal = Pattern.compile("^// ACC_FINAL : *(.*)"); + private static final Pattern isInterface = Pattern.compile("^// ACC_INTERFACE : *(.*)"); + private static final Pattern isPublic = Pattern.compile("^// ACC_PUBLIC : *(.*)"); + private static final Pattern isStatic = Pattern.compile("^// ACC_STATIC : *(.*)"); + private static final Pattern isSuper = Pattern.compile("^// ACC_SUPER : *(.*)"); + + private Expectation parseExpectations() throws IOException { + List lines = Files.readLines(ktFile, Charset.forName("utf-8")); + for (int i = 0; i < lines.size() - 6; ++i) { + Matcher abstractMatcher = isAbstract.matcher(lines.get(i)); + if (abstractMatcher.matches()) { + Matcher annotationMatcher = isAnnotation.matcher(lines.get(i + 1)); + Matcher finalMatcher = isFinal.matcher(lines.get(i + 2)); + Matcher interfaceMatcher = isInterface.matcher(lines.get(i + 3)); + Matcher publicMatcher = isPublic.matcher(lines.get(i + 4)); + Matcher staticMatcher = isStatic.matcher(lines.get(i + 5)); + Matcher superMatcher = isSuper.matcher(lines.get(i + 6)); + + if (!interfaceMatcher.matches() + || !annotationMatcher.matches() + || !finalMatcher.matches() + || !interfaceMatcher.matches() + || !publicMatcher.matches() + || !staticMatcher.matches() + || !superMatcher.matches()) { + throw new AssertionError("Incorrect test instructions format"); + } + + return new Expectation(abstractMatcher.group(1), + annotationMatcher.group(1), + finalMatcher.group(1), + interfaceMatcher.group(1), + publicMatcher.group(1), + staticMatcher.group(1), + superMatcher.group(1)); + } + } + throw new AssertionError("test instructions not found in " + ktFile); + } +} From 696df0eb9b24a34f6ca842b91b9c511fd117e357 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 11 May 2012 14:24:30 +0400 Subject: [PATCH 03/88] more tests for KT-1897 #KT-1897 fixed --- .../jet/lang/resolve/calls/CallResolver.java | 6 ++--- .../ValueArgumentsToParametersMapper.java | 12 +++++----- .../checkArguments/kt1897_diagnostic_part.jet | 24 +++++++++++++++++-- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index bed5e619a86..cc20d2cfef8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -416,7 +416,7 @@ public class CallResolver { checkTypesWithNoCallee(context.toBasic()); return; } - checkUnknownArgumentTypes(context.toBasic(), unmappedArguments); + checkUnmappedArgumentTypes(context.toBasic(), unmappedArguments); } List jetTypeArguments = context.call.getTypeArguments(); @@ -612,8 +612,8 @@ public class CallResolver { } } - private void checkUnknownArgumentTypes(BasicResolutionContext context, Set unknownArguments) { - for (ValueArgument valueArgument : unknownArguments) { + private void checkUnmappedArgumentTypes(BasicResolutionContext context, Set unmappedArguments) { + for (ValueArgument valueArgument : unmappedArguments) { JetExpression argumentExpression = valueArgument.getArgumentExpression(); if (argumentExpression != null) { expressionTypingServices.getType(context.scope, argumentExpression, NO_EXPECTED_TYPE, context.trace); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java index 105ec16e5f2..4dc09f10d31 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java @@ -101,7 +101,7 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap if (valueParameterDescriptor == null) { temporaryTrace.report(NAMED_PARAMETER_NOT_FOUND.on(nameReference)); unmappedArguments.add(valueArgument); - status = ERROR; + status = WEAK_ERROR; } else { temporaryTrace.record(REFERENCE_TARGET, nameReference, valueParameterDescriptor); @@ -116,14 +116,14 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap } if (somePositioned) { temporaryTrace.report(MIXING_NAMED_AND_POSITIONED_ARGUMENTS.on(nameReference)); - status = ERROR; + status = WEAK_ERROR; } } else { somePositioned = true; if (someNamed) { temporaryTrace.report(MIXING_NAMED_AND_POSITIONED_ARGUMENTS.on(valueArgument.asElement())); - status = ERROR; + status = WEAK_ERROR; } else { int parameterCount = valueParameters.size(); @@ -147,7 +147,7 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap else { temporaryTrace.report(TOO_MANY_ARGUMENTS.on(valueArgument.asElement(), candidate)); unmappedArguments.add(valueArgument); - status = WEAK_ERROR; + status = ERROR; } } } @@ -179,7 +179,7 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap else { if (!usedParameters.add(valueParameterDescriptor)) { temporaryTrace.report(TOO_MANY_ARGUMENTS.on(possiblyLabeledFunctionLiteral, candidate)); - status = ERROR; + status = WEAK_ERROR; } else { status = status.compose(put(candidateCall, valueParameterDescriptor, CallMaker.makeValueArgument(functionLiteral), varargs)); @@ -190,7 +190,7 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap for (int i = 1; i < functionLiteralArguments.size(); i++) { JetExpression argument = functionLiteralArguments.get(i); temporaryTrace.report(MANY_FUNCTION_LITERAL_ARGUMENTS.on(argument)); - status = ERROR; + status = WEAK_ERROR; } } diff --git a/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.jet b/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.jet index e5d1371119a..b5f67ee5ab8 100644 --- a/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.jet +++ b/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.jet @@ -1,8 +1,28 @@ +//KT-1897 When call cannot be resolved to any function, save information about types of arguments + package a -fun foo(i: Int, s: String) { -} +fun bar() {} + +fun foo(i: Int, s: String) {} fun test() { + + bar(xx) + + bar { } + foo("", 1, xx) + + foo(r = xx, i = "", s = "") + + foo(i = 1, i = 1, s = 11) + + foo("", s = 2) + + foo(i = "", s = 2, 33) + + foo("", 1) {} + + foo("", 1) {} {} } \ No newline at end of file From b1e5a0768c36a2c466bc864fa41d65ad365b5317 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 11 May 2012 15:03:23 +0400 Subject: [PATCH 04/88] KT-1955 Half a file is red on incomplete code #KT-1955 fixed --- .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 2 +- .../testData/diagnostics/tests/incompleteCode/kt1955.jet | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/incompleteCode/kt1955.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 997ef40c1fb..902de8fe6a4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -252,7 +252,7 @@ public interface Errors { JetBlockExpression blockExpression = (JetBlockExpression)bodyExpression; TextRange lastBracketRange = blockExpression.getLastBracketRange(); if (lastBracketRange == null) { - return markElement(element); + return Collections.emptyList(); } return markRange(lastBracketRange); } diff --git a/compiler/testData/diagnostics/tests/incompleteCode/kt1955.jet b/compiler/testData/diagnostics/tests/incompleteCode/kt1955.jet new file mode 100644 index 00000000000..e0821228b58 --- /dev/null +++ b/compiler/testData/diagnostics/tests/incompleteCode/kt1955.jet @@ -0,0 +1,8 @@ +//KT-1955 Half a file is red on incomplete code + +package b + +fun foo() { + val a = 1 + + From fac735a4195a6df8d526dde4051f352bb4d2939b Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 11 May 2012 15:49:59 +0400 Subject: [PATCH 05/88] Fixed compilation for new projects The problem was: IDEA passes a DummyCompilerContext, whose project is null As a result, a freshly created "Hello, world" didn't run (failed with NoClassDefFound, because the compiler didn't emit any code) --- idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java index 5b903fc9279..c66cdc96710 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java @@ -62,7 +62,7 @@ public class JetCompiler implements TranslatingCompiler { return false; } Project project = compileContext.getProject(); - if (project == null || JsModuleDetector.isJsProject(project)) { + if (project != null && JsModuleDetector.isJsProject(project)) { return false; } return true; From f67aebe4be082e5b03b543ebba8624a26f9930a8 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 2 May 2012 12:20:54 +0400 Subject: [PATCH 06/88] On the way refactorings --- .../jet/lang/ModuleConfiguration.java | 4 +- .../descriptors/MutableClassDescriptor.java | 20 ++++++--- .../descriptors/NamespaceDescriptorImpl.java | 5 ++- .../jet/lang/descriptors/Visibilities.java | 3 ++ .../jet/lang/parsing/JetParsing.java | 44 +++++++++---------- .../jet/lang/resolve/ImportPath.java | 4 +- 6 files changed, 46 insertions(+), 34 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/ModuleConfiguration.java b/compiler/frontend/src/org/jetbrains/jet/lang/ModuleConfiguration.java index d5366ad5204..1d55fcf0c56 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/ModuleConfiguration.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/ModuleConfiguration.java @@ -42,8 +42,8 @@ public interface ModuleConfiguration { void addDefaultImports(@NotNull Collection directives); /** - * - * This method is called every time a namespace descriptor is created. Use it to add extra descriptors to the namespace, e.g. merge a Java package with a Kotlin one + * This method is called every time a namespace descriptor is created. Use it to add extra descriptors to the namespace, e.g. merge a + * Java package with a Kotlin one */ void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 6854bf0777d..75cc71b057e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -22,7 +22,10 @@ import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.jet.lang.resolve.AbstractScopeAdapter; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.resolve.scopes.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; @@ -43,14 +46,21 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { private final WritableScope scopeForSupertypeResolution; private WritableScope scopeForInitializers = null; //contains members + primary constructor value parameters + map for backing fields - public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope, ClassKind kind) { + public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, + @NotNull JetScope outerScope, ClassKind kind) { super(containingDeclaration, kind); RedeclarationHandler redeclarationHandler = RedeclarationHandler.DO_NOTHING; - setScopeForMemberLookup(new WritableScopeImpl(JetScope.EMPTY, this, redeclarationHandler).setDebugName("MemberLookup").changeLockLevel(WritableScope.LockLevel.BOTH)); - this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler).setDebugName("SupertypeResolution").changeLockLevel(WritableScope.LockLevel.BOTH); - this.scopeForMemberResolution = new WritableScopeImpl(scopeForSupertypeResolution, this, redeclarationHandler).setDebugName("MemberResolution").changeLockLevel(WritableScope.LockLevel.BOTH); + setScopeForMemberLookup(new WritableScopeImpl(JetScope.EMPTY, this, redeclarationHandler) + .setDebugName("MemberLookup") + .changeLockLevel(WritableScope.LockLevel.BOTH)); + this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler) + .setDebugName("SupertypeResolution") + .changeLockLevel(WritableScope.LockLevel.BOTH); + this.scopeForMemberResolution = new WritableScopeImpl(scopeForSupertypeResolution, this, redeclarationHandler) + .setDebugName("MemberResolution") + .changeLockLevel(WritableScope.LockLevel.BOTH); if (getKind() == ClassKind.TRAIT) { setUpScopeForInitializers(this); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java index 17990d263b2..d5d60a00eab 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; @@ -30,7 +29,9 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp private WritableScope memberScope; - public NamespaceDescriptorImpl(@NotNull NamespaceDescriptorParent containingDeclaration, @NotNull List annotations, @NotNull String name) { + public NamespaceDescriptorImpl(@NotNull NamespaceDescriptorParent containingDeclaration, + @NotNull List annotations, + @NotNull String name) { super(containingDeclaration, annotations, name); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java index 10df49710e6..151ee5df33b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java @@ -109,6 +109,9 @@ public class Visibilities { public static final Set INTERNAL_VISIBILITIES = Sets.newHashSet(PRIVATE, INTERNAL, INTERNAL_PROTECTED, LOCAL); + private Visibilities() { + } + public static boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) { DeclarationDescriptorWithVisibility parent = what; while (parent != null) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java index 9d0da50c551..cb05ae1c528 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java @@ -57,13 +57,13 @@ public class JetParsing extends AbstractJetParsing { /*package*/ static final TokenSet TYPE_REF_FIRST = TokenSet.create(LBRACKET, IDENTIFIER, FUN_KEYWORD, LPAR, CAPITALIZED_THIS_KEYWORD, HASH); private static final TokenSet RECEIVER_TYPE_TERMINATORS = TokenSet.create(DOT, SAFE_ACCESS); - public static JetParsing createForTopLevel(SemanticWhitespaceAwarePsiBuilder builder) { + static JetParsing createForTopLevel(SemanticWhitespaceAwarePsiBuilder builder) { JetParsing jetParsing = new JetParsing(builder); jetParsing.myExpressionParsing = new JetExpressionParsing(builder, jetParsing); return jetParsing; } - public static JetParsing createForByClause(final SemanticWhitespaceAwarePsiBuilder builder) { + private static JetParsing createForByClause(final SemanticWhitespaceAwarePsiBuilder builder) { final SemanticWhitespaceAwarePsiBuilderForByClause builderForByClause = new SemanticWhitespaceAwarePsiBuilderForByClause(builder); JetParsing jetParsing = new JetParsing(builderForByClause); jetParsing.myExpressionParsing = new JetExpressionParsing(builderForByClause, jetParsing) { @@ -94,7 +94,7 @@ public class JetParsing extends AbstractJetParsing { * : preamble toplevelObject[| import]* [eof] * ; */ - public void parseFile() { + void parseFile() { PsiBuilder.Marker fileMarker = mark(); parsePreamble(); @@ -297,7 +297,7 @@ public class JetParsing extends AbstractJetParsing { /* * (modifier | attribute)* */ - public boolean parseModifierList(JetNodeType nodeType, boolean allowShortAnnotations) { + boolean parseModifierList(JetNodeType nodeType, boolean allowShortAnnotations) { return parseModifierList(nodeType, null, allowShortAnnotations); } @@ -306,7 +306,7 @@ public class JetParsing extends AbstractJetParsing { * * Feeds modifiers (not attributes) into the passed consumer, if it is not null */ - public boolean parseModifierList(JetNodeType nodeType, Consumer tokenConsumer, boolean allowShortAnnotations) { + boolean parseModifierList(JetNodeType nodeType, @Nullable Consumer tokenConsumer, boolean allowShortAnnotations) { PsiBuilder.Marker list = mark(); boolean empty = true; while (!eof()) { @@ -336,8 +336,10 @@ public class JetParsing extends AbstractJetParsing { * : annotation* * ; */ - public void parseAnnotations(boolean allowShortAnnotations) { - while (parseAnnotation(allowShortAnnotations)); + void parseAnnotations(boolean allowShortAnnotations) { + while (true) { + if (!(parseAnnotation(allowShortAnnotations))) break; + } } /* @@ -417,7 +419,7 @@ public class JetParsing extends AbstractJetParsing { * (classBody? | enumClassBody) * ; */ - public IElementType parseClass(boolean enumClass) { + IElementType parseClass(boolean enumClass) { assert _atSet(CLASS_KEYWORD, TRAIT_KEYWORD); advance(); // CLASS_KEYWORD or TRAIT_KEYWORD @@ -649,7 +651,7 @@ public class JetParsing extends AbstractJetParsing { * : "object" SimpleName? ":" delegationSpecifier{","}? classBody? * ; */ - public void parseObject(boolean named, boolean optionalBody) { + void parseObject(boolean named, boolean optionalBody) { assert _at(OBJECT_KEYWORD); advance(); // OBJECT_KEYWORD @@ -785,7 +787,7 @@ public class JetParsing extends AbstractJetParsing { * : modifiers "type" SimpleName (typeParameters typeConstraints)? "=" type * ; */ - public JetNodeType parseTypeDef() { + JetNodeType parseTypeDef() { assert _at(TYPE_KEYWORD); advance(); // TYPE_KEYWORD @@ -815,11 +817,11 @@ public class JetParsing extends AbstractJetParsing { * (getter? setter? | setter? getter?) SEMI? * ; */ - public JetNodeType parseProperty() { + private JetNodeType parseProperty() { return parseProperty(false); } - public JetNodeType parseProperty(boolean local) { + JetNodeType parseProperty(boolean local) { if (at(VAL_KEYWORD) || at(VAR_KEYWORD)) { advance(); // VAL_KEYWORD or VAR_KEYWORD } @@ -970,7 +972,7 @@ public class JetParsing extends AbstractJetParsing { * functionBody? * ; */ - public IElementType parseFunction() { + IElementType parseFunction() { assert _at(FUN_KEYWORD); advance(); // FUN_KEYWORD @@ -1086,7 +1088,7 @@ public class JetParsing extends AbstractJetParsing { * : "{" (expressions)* "}" * ; */ - public void parseBlock() { + void parseBlock() { PsiBuilder.Marker block = mark(); myBuilder.enableNewlines(); @@ -1303,11 +1305,11 @@ public class JetParsing extends AbstractJetParsing { * nullableType * : typeDescriptor "?" */ - public void parseTypeRef() { + void parseTypeRef() { parseTypeRef(TokenSet.EMPTY); } - public void parseTypeRef(TokenSet extraRecoverySet) { + void parseTypeRef(TokenSet extraRecoverySet) { PsiBuilder.Marker typeRefMarker = parseTypeRefContents(extraRecoverySet); typeRefMarker.done(TYPE_REFERENCE); } @@ -1461,7 +1463,7 @@ public class JetParsing extends AbstractJetParsing { /* * (optionalProjection type){","} */ - public PsiBuilder.Marker parseTypeArgumentList() { + private PsiBuilder.Marker parseTypeArgumentList() { if (!at(LT)) return null; PsiBuilder.Marker list = mark(); @@ -1472,7 +1474,7 @@ public class JetParsing extends AbstractJetParsing { return list; } - public boolean tryParseTypeArgumentList(TokenSet extraRecoverySet) { + boolean tryParseTypeArgumentList(TokenSet extraRecoverySet) { myBuilder.disableNewlines(); advance(); // LT @@ -1605,7 +1607,7 @@ public class JetParsing extends AbstractJetParsing { * : parameter ("=" element)? * ; */ - public void parseValueParameterList(boolean isFunctionTypeContents, TokenSet recoverySet) { + void parseValueParameterList(boolean isFunctionTypeContents, TokenSet recoverySet) { PsiBuilder.Marker parameters = mark(); myBuilder.disableNewlines(); @@ -1736,10 +1738,6 @@ public class JetParsing extends AbstractJetParsing { this.tokens = TokenSet.create(token); } - public TokenDetector(TokenSet tokens) { - this.tokens = tokens; - } - @Override public void consume(IElementType item) { if (tokens.contains(item)) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportPath.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportPath.java index 661969e7550..720b8a469fb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportPath.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportPath.java @@ -22,8 +22,8 @@ import org.jetbrains.annotations.NotNull; * @author Nikolay Krasko */ public final class ImportPath { - final @NotNull FqName fqName; - final boolean isAllUnder; + private final @NotNull FqName fqName; + private final boolean isAllUnder; public ImportPath(@NotNull FqName fqName, boolean isAllUnder) { this.fqName = fqName; From 9cb7cb56f1a8920e84340a76550cb96de9bb4099 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 11 May 2012 15:02:41 +0400 Subject: [PATCH 07/88] Refactoring - new interface for common method --- .../jetbrains/jet/lang/psi/JetClassBody.java | 4 ++- .../jet/lang/psi/JetClassOrObject.java | 4 +-- .../jet/lang/psi/JetDeclarationContainer.java | 29 +++++++++++++++++++ .../org/jetbrains/jet/lang/psi/JetFile.java | 5 +++- .../jet/lang/psi/JetNamespaceBody.java | 4 ++- 5 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationContainer.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClassBody.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClassBody.java index 853d94cc51c..11da1bacd73 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClassBody.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClassBody.java @@ -30,11 +30,13 @@ import java.util.List; /** * @author max */ -public class JetClassBody extends JetElement { +public class JetClassBody extends JetElement implements JetDeclarationContainer { public JetClassBody(@NotNull ASTNode node) { super(node); } + @Override + @NotNull public List getDeclarations() { return PsiTreeUtil.getChildrenOfTypeAsList(this, JetDeclaration.class); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClassOrObject.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClassOrObject.java index 42e0d6d1239..a4ad2a43b6e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClassOrObject.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClassOrObject.java @@ -26,9 +26,7 @@ import java.util.List; /** * @author max */ -public interface JetClassOrObject extends PsiElement, PsiNameIdentifierOwner { - List getDeclarations(); - +public interface JetClassOrObject extends PsiElement, PsiNameIdentifierOwner, JetDeclarationContainer { @Nullable JetDelegationSpecifierList getDelegationSpecifierList(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationContainer.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationContainer.java new file mode 100644 index 00000000000..07a76741a12 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationContainer.java @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2012 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.psi; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author Nikolay Krasko + */ +public interface JetDeclarationContainer { + @NotNull + List getDeclarations(); +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFile.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFile.java index 152b3d4b883..84ccdd7d97f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFile.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFile.java @@ -33,11 +33,12 @@ import org.jetbrains.jet.plugin.JetLanguage; import java.util.List; -public class JetFile extends PsiFileBase { +public class JetFile extends PsiFileBase implements JetDeclarationContainer { public JetFile(FileViewProvider viewProvider) { super(viewProvider, JetLanguage.INSTANCE); } + @Override @NotNull public FileType getFileType() { return JetFileType.INSTANCE; @@ -48,6 +49,8 @@ public class JetFile extends PsiFileBase { return "JetFile: " + getName(); } + @NotNull + @Override public List getDeclarations() { return PsiTreeUtil.getChildrenOfTypeAsList(this, JetDeclaration.class); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceBody.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceBody.java index a599f4b8e4a..bbe19cf4d8b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceBody.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceBody.java @@ -25,11 +25,13 @@ import java.util.List; /** * @author max */ -public class JetNamespaceBody extends JetElement { +public class JetNamespaceBody extends JetElement implements JetDeclarationContainer { public JetNamespaceBody(@NotNull ASTNode node) { super(node); } + @NotNull + @Override public List getDeclarations() { return PsiTreeUtil.getChildrenOfTypeAsList(this, JetDeclaration.class); } From 39ec3f7c14678fab2725cffbc05629b6a00be2e3 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 11 May 2012 15:15:44 +0400 Subject: [PATCH 08/88] Print file name at least in diagnostic --- .../src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java index be456c83593..82ca7a8ebe1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java @@ -73,7 +73,7 @@ public class DiagnosticUtils { public static String atLocation(PsiFile file, TextRange textRange, Document document) { int offset = textRange.getStartOffset(); VirtualFile virtualFile = file.getVirtualFile(); - String pathSuffix = virtualFile == null ? "" : " in " + virtualFile.getPath(); + String pathSuffix = " in " + (virtualFile == null ? file.getName() : virtualFile.getPath()); return offsetToLineAndColumn(document, offset).toString() + pathSuffix; } From aa4252462fc9170fad6a8968f077f679322ec255 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 11 May 2012 16:26:26 +0400 Subject: [PATCH 09/88] replace 'for (;;)' with 'while (true)' --- .../src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java | 2 +- .../src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java | 2 +- .../jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java | 4 ++-- examples/src/benchmarks/src/lockperf/LockPerf.java | 2 +- .../org/jetbrains/jet/rt/signature/JetSignatureReader.java | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java index 3a00c1f85eb..c1fb3d10f21 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java @@ -318,7 +318,7 @@ public class DescriptorUtils { public static List getPathWithoutRootNsAndModule(@NotNull DeclarationDescriptor descriptor) { List path = Lists.newArrayList(); DeclarationDescriptor current = descriptor; - for (;;) { + while (true) { if (current instanceof NamespaceDescriptor && isRootNamespace((NamespaceDescriptor) current)) { return Lists.reverse(path); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java index dc9a8d30156..ceb0222edf2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java @@ -196,7 +196,7 @@ public class FqNameUnsafe { FqNameUnsafe last = new FqNameUnsafe(firstSegment, FqName.ROOT.toUnsafe(), firstSegment); callback.segment(firstSegment, last); - for (;;) { + while (true) { int next = fqName.indexOf('.', pos + 1); if (next < 0) { if (this.parent == null) { diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java index e7be1728e58..3ee445add52 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java @@ -52,7 +52,7 @@ class NamespaceComparator { @NotNull File txtFile) { String serialized = new NamespaceComparator(includeObject).doCompareNamespaces(nsa, nsb); try { - for (;;) { + while (true) { String expected = Files.toString(txtFile, Charset.forName("utf-8")).replace("\r\n", "\n"); if (expected.contains("kick me")) { @@ -549,7 +549,7 @@ class NamespaceComparator { try { StringBuilder r = new StringBuilder(); BufferedReader reader = new BufferedReader(new StringReader(string)); - for (;;) { + while (true) { String line = reader.readLine(); if (line == null) { break; diff --git a/examples/src/benchmarks/src/lockperf/LockPerf.java b/examples/src/benchmarks/src/lockperf/LockPerf.java index b413bc2ad71..19a615c73ca 100644 --- a/examples/src/benchmarks/src/lockperf/LockPerf.java +++ b/examples/src/benchmarks/src/lockperf/LockPerf.java @@ -33,7 +33,7 @@ public class LockPerf { for (int i = 0; i < threadNum; ++i) { new Thread(new Runnable() { public void run() { - for (;;) { + while (true) { lock.lock(); try { if (counter.get() == 100000000) { diff --git a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java index 5813ba46bf5..a084aa76076 100644 --- a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java +++ b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java @@ -181,7 +181,7 @@ public class JetSignatureReader { start = pos; visited = false; inner = false; - for (;;) { + while (true) { switch (c = signature.charAt(pos++)) { case '.': case ';': @@ -212,7 +212,7 @@ public class JetSignatureReader { v.visitClassType(name, nullable, forceReal); } visited = true; - top: for (;;) { + top: while (true) { switch (c = signature.charAt(pos)) { case '>': break top; From fddd9eff574cca7c875768a7b0b255b06f196b14 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 11 May 2012 17:08:20 +0400 Subject: [PATCH 10/88] Possible fix of EA-34996 --- .../org/jetbrains/jet/lang/resolve/calls/CallResolver.java | 6 +----- .../resolve/calls/ValueArgumentsToParametersMapper.java | 2 ++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index cc20d2cfef8..2ea4695d62e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -328,11 +328,7 @@ public class CallResolver { // We have some candidates that failed for some reason // And we have a suspect: the function literal argument // Now, we try to remove this argument and see if it helps - Collection> newCandidates = Lists.newArrayList(); - for (ResolutionCandidate candidate : task.getCandidates()) { - newCandidates.add(ResolutionCandidate.create(candidate.getDescriptor(), candidate.isSafeCall())); //todo check receivers are not necessary - } - ResolutionTask newContext = new ResolutionTask(newCandidates, task.reference, TemporaryBindingTrace.create(task.trace), task.scope, new DelegatingCall(task.call) { + ResolutionTask newContext = new ResolutionTask(task.getCandidates(), task.reference, TemporaryBindingTrace.create(task.trace), task.scope, new DelegatingCall(task.call) { @NotNull @Override public List getFunctionLiteralArguments() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java index 4dc09f10d31..8d1a2fdd704 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java @@ -222,6 +222,8 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap status = ERROR; } + assert (candidateCall.getThisObject().exists() == candidateCall.getResultingDescriptor().getExpectedThisObject().exists()) : "Shouldn't happen because of TaskPrioritizer: " + candidateCall.getCandidateDescriptor(); + return status; } From c63af879fa74e63abe301b60dff6c369280e503d Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 11 May 2012 17:21:52 +0400 Subject: [PATCH 11/88] KT-1947 Don't analyze Kotlin files that are not under source folders #KT-1947 Fixed --- .../jetbrains/jet/plugin/project/PluginJetFilesProvider.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/project/PluginJetFilesProvider.java b/idea/src/org/jetbrains/jet/plugin/project/PluginJetFilesProvider.java index d69f562278b..65743eb3017 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/PluginJetFilesProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/project/PluginJetFilesProvider.java @@ -27,6 +27,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ContentIterator; +import com.intellij.openapi.roots.ModuleFileIndex; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; @@ -60,10 +61,12 @@ public class PluginJetFilesProvider extends JetFilesProvider { ModuleUtil.getDependencies(rootModule, allModules); for (Module module : allModules) { - ModuleRootManager.getInstance(module).getFileIndex().iterateContent(new ContentIterator() { + final ModuleFileIndex index = ModuleRootManager.getInstance(module).getFileIndex(); + index.iterateContent(new ContentIterator() { @Override public boolean processFile(VirtualFile file) { if (file.isDirectory()) return true; + if (!index.isInSourceContent(file) && !index.isInTestSourceContent(file)) return true; final FileType fileType = FileTypeManager.getInstance().getFileTypeByFile(file); if (fileType != JetFileType.INSTANCE) return true; From 420a7c9ad43970e59e85cd7efa9cd7bb0a01531f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 11 May 2012 18:00:09 +0400 Subject: [PATCH 12/88] KT-1961 Incorrect override error in functions with type parameter with two upper bounds #KT-1961 Fixed --- .../types/IntersectionTypeConstructor.java | 100 ++++++++++++++++++ .../jetbrains/jet/lang/types/TypeUtils.java | 20 +--- .../override/EqualityOfIntersectionTypes.jet | 15 +++ 3 files changed, 116 insertions(+), 19 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/types/IntersectionTypeConstructor.java create mode 100644 compiler/testData/diagnostics/tests/override/EqualityOfIntersectionTypes.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/IntersectionTypeConstructor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/IntersectionTypeConstructor.java new file mode 100644 index 00000000000..2a9136302ae --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/IntersectionTypeConstructor.java @@ -0,0 +1,100 @@ +/* + * Copyright 2010-2012 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.types; + + +import com.google.common.collect.Sets; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; +import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; +import org.jetbrains.jet.lang.descriptors.annotations.AnnotatedImpl; +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; + +import java.util.*; + +/** + * @author abreslav + */ +public class IntersectionTypeConstructor extends AnnotatedImpl implements TypeConstructor { + private final Set intersectedTypes; + private final int hashCode; + + public IntersectionTypeConstructor(List annotations, Collection typesToIntersect) { + super(annotations); + this.intersectedTypes = Sets.newLinkedHashSet(typesToIntersect); + this.hashCode = intersectedTypes.hashCode(); + } + + @NotNull + @Override + public List getParameters() { + return Collections.emptyList(); + } + + @NotNull + @Override + public Collection getSupertypes() { + return intersectedTypes; + } + + @Override + public boolean isSealed() { + return false; + } + + @Override + public ClassifierDescriptor getDeclarationDescriptor() { + return null; + } + + @Override + public String toString() { + return makeDebugNameForIntersectionType(intersectedTypes); + } + + private static String makeDebugNameForIntersectionType(Iterable resultingTypes) { + StringBuilder debugName = new StringBuilder("{"); + for (Iterator iterator = resultingTypes.iterator(); iterator.hasNext(); ) { + JetType type = iterator.next(); + + debugName.append(type.toString()); + if (iterator.hasNext()) { + debugName.append(" & "); + } + } + debugName.append("}"); + return debugName.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + IntersectionTypeConstructor that = (IntersectionTypeConstructor) o; + + if (intersectedTypes != null ? !intersectedTypes.equals(that.intersectedTypes) : that.intersectedTypes != null) return false; + + return true; + } + + @Override + public int hashCode() { + return hashCode; + } + +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java index 3e2c231da4c..bf9eabc071d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java @@ -193,12 +193,8 @@ public class TypeUtils { List noAnnotations = Collections.emptyList(); - TypeConstructor constructor = new TypeConstructorImpl( - null, + TypeConstructor constructor = new IntersectionTypeConstructor( noAnnotations, - false, - makeDebugNameForIntersectionType(resultingTypes).toString(), - Collections.emptyList(), resultingTypes); JetScope[] scopes = new JetScope[resultingTypes.size()]; @@ -269,20 +265,6 @@ public class TypeUtils { } } - private static StringBuilder makeDebugNameForIntersectionType(Iterable resultingTypes) { - StringBuilder debugName = new StringBuilder("{"); - for (Iterator iterator = resultingTypes.iterator(); iterator.hasNext(); ) { - JetType type = iterator.next(); - - debugName.append(type.toString()); - if (iterator.hasNext()) { - debugName.append(" & "); - } - } - debugName.append("}"); - return debugName; - } - public static boolean canHaveSubtypes(JetTypeChecker typeChecker, JetType type) { if (type.isNullable()) { return true; diff --git a/compiler/testData/diagnostics/tests/override/EqualityOfIntersectionTypes.jet b/compiler/testData/diagnostics/tests/override/EqualityOfIntersectionTypes.jet new file mode 100644 index 00000000000..33c380bc350 --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/EqualityOfIntersectionTypes.jet @@ -0,0 +1,15 @@ +trait Foo +trait Bar + +trait A { + fun foo() + where T : Foo, T : Bar + = #() +} + +class B : A { + override fun foo() + where T : Foo, T : Bar + = #() + +} \ No newline at end of file From 6c4478f54440df8b28ff82965c73a517318bc39d Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 11 May 2012 18:24:57 +0400 Subject: [PATCH 13/88] simplify renderer --- .../org/jetbrains/jet/resolve/DescriptorRenderer.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 55389a43d94..1f0b5c90416 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -306,7 +306,7 @@ public class DescriptorRenderer implements Renderer { type); renderName(descriptor, builder); builder.append(" : ").append(escape(typeString)); - return super.visitVariableDescriptor(descriptor, builder); + return null; } private String renderPropertyPrefixAndComputeTypeString( @@ -388,7 +388,7 @@ public class DescriptorRenderer implements Renderer { renderName(descriptor, builder); renderValueParameters(descriptor, builder); builder.append(" : ").append(escape(renderType(descriptor.getReturnType()))); - return super.visitFunctionDescriptor(descriptor, builder); + return null; } private void renderValueParameters(FunctionDescriptor descriptor, StringBuilder builder) { @@ -436,14 +436,14 @@ public class DescriptorRenderer implements Renderer { builder.append(lt()); renderTypeParameter(descriptor, builder); builder.append(">"); - return super.visitTypeParameterDescriptor(descriptor, builder); + return null; } @Override public Void visitNamespaceDescriptor(NamespaceDescriptor namespaceDescriptor, StringBuilder builder) { builder.append(renderKeyword(JetTokens.PACKAGE_KEYWORD.getValue())).append(" "); renderName(namespaceDescriptor, builder); - return super.visitNamespaceDescriptor(namespaceDescriptor, builder); + return null; } @Override @@ -466,7 +466,7 @@ public class DescriptorRenderer implements Renderer { keyword = "class"; } renderClassDescriptor(descriptor, builder, keyword); - return super.visitClassDescriptor(descriptor, builder); + return null; } private boolean isClassObjectDescriptor(ClassDescriptor descriptor) { From 9a05af17576267d19c27127f833d8147862b6cd4 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 11 May 2012 18:24:57 +0400 Subject: [PATCH 14/88] stdlib and jdk-headers are not needed in DescriptorRenderer --- .../org/jetbrains/jet/resolve/DescriptorRendererTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/tests/org/jetbrains/jet/resolve/DescriptorRendererTest.java b/compiler/tests/org/jetbrains/jet/resolve/DescriptorRendererTest.java index 01b59cebb8d..df7872b0324 100644 --- a/compiler/tests/org/jetbrains/jet/resolve/DescriptorRendererTest.java +++ b/compiler/tests/org/jetbrains/jet/resolve/DescriptorRendererTest.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetVisitorVoid; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; +import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; import java.io.IOException; import java.util.ArrayList; @@ -43,7 +44,7 @@ public class DescriptorRendererTest extends JetLiteFixture { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); } From 3af2b1b80a8897d043eb986b90ce9a9b0d3e61a1 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 11 May 2012 18:24:58 +0400 Subject: [PATCH 15/88] improve rendering of upper bounds --- .../jet/resolve/DescriptorRenderer.java | 59 +++++++++++++++---- compiler/testData/renderer/GlobalFunctions.kt | 11 +++- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 1f0b5c90416..d18b2c2c768 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -80,7 +80,7 @@ public class DescriptorRenderer implements Renderer { private final DeclarationDescriptorVisitor subVisitor = new RenderDeclarationDescriptorVisitor() { @Override public Void visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, StringBuilder builder) { - renderTypeParameter(descriptor, builder); + renderTypeParameter(descriptor, builder, false); return null; } @@ -388,6 +388,7 @@ public class DescriptorRenderer implements Renderer { renderName(descriptor, builder); renderValueParameters(descriptor, builder); builder.append(" : ").append(escape(renderType(descriptor.getReturnType()))); + renderWhereSuffix(descriptor, builder); return null; } @@ -403,6 +404,28 @@ public class DescriptorRenderer implements Renderer { builder.append(")"); } + private void renderWhereSuffix(@NotNull CallableMemberDescriptor callable, @NotNull StringBuilder builder) { + boolean first = true; + for (TypeParameterDescriptor typeParameter : callable.getTypeParameters()) { + if (typeParameter.getUpperBounds().size() > 1) { + for (JetType upperBound : typeParameter.getUpperBounds()) { + if (first) { + builder.append(" "); + builder.append(renderKeyword("where")); + builder.append(" "); + } + else { + builder.append(", "); + } + builder.append(typeParameter.getName()); + builder.append(" : "); + builder.append(escape(renderType(upperBound))); + first = false; + } + } + } + } + @Override public Void visitConstructorDescriptor(ConstructorDescriptor constructorDescriptor, StringBuilder builder) { builder.append(renderKeyword("ctor")).append(" "); @@ -434,7 +457,7 @@ public class DescriptorRenderer implements Renderer { @Override public Void visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, StringBuilder builder) { builder.append(lt()); - renderTypeParameter(descriptor, builder); + renderTypeParameter(descriptor, builder, true); builder.append(">"); return null; } @@ -513,7 +536,7 @@ public class DescriptorRenderer implements Renderer { stringBuilder.append(escape(descriptor.getName())); } - protected void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder) { + protected void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder, boolean topLevel) { if (descriptor.isReified()) { String variance = descriptor.getVariance().toString(); if (!variance.isEmpty()) { @@ -524,15 +547,31 @@ public class DescriptorRenderer implements Renderer { builder.append(renderKeyword("erased")).append(" "); } renderName(descriptor, builder); - if (!descriptor.getUpperBounds().isEmpty()) { - JetType bound = descriptor.getUpperBounds().iterator().next(); - if (bound != JetStandardClasses.getDefaultBound()) { - builder.append(" : ").append(renderType(bound)); - if (descriptor.getUpperBounds().size() > 1) { - builder.append(" (...)"); - } + if (descriptor.getUpperBounds().size() == 1) { + JetType upperBound = descriptor.getUpperBounds().iterator().next(); + if (upperBound != JetStandardClasses.getDefaultBound()) { + builder.append(" : ").append(renderType(upperBound)); } } + else if (topLevel) { + boolean first = true; + for (JetType upperBound : descriptor.getUpperBounds()) { + if (upperBound.equals(JetStandardClasses.getDefaultBound())) { + continue; + } + if (first) { + builder.append(" : "); + } + else { + builder.append(" & "); + } + builder.append(renderType(upperBound)); + first = false; + } + } + else { + // rendered with "where" + } } } } diff --git a/compiler/testData/renderer/GlobalFunctions.kt b/compiler/testData/renderer/GlobalFunctions.kt index b2226aa8547..4b92a1bd4f4 100644 --- a/compiler/testData/renderer/GlobalFunctions.kt +++ b/compiler/testData/renderer/GlobalFunctions.kt @@ -12,6 +12,11 @@ public fun Int.ext() : Int {} public fun withTypeParam(a : Array) : Int {} +trait Foo +trait Bar + +fun

funTypeParameterWithTwoUpperBounds() where P : Foo, P : Bar = 17 + //package rendererTest defined in root package //public final fun pub() : Unit defined in rendererTest //internal final fun int() : jet.String defined in rendererTest @@ -23,4 +28,8 @@ public fun withTypeParam(a : Array) : Int {} //public final fun jet.Int.ext() : jet.Int defined in rendererTest //public final fun withTypeParam(a : jet.Array) : jet.Int defined in rendererTest // defined in rendererTest.withTypeParam -//value-parameter val a : jet.Array defined in rendererTest.withTypeParam \ No newline at end of file +//value-parameter val a : jet.Array defined in rendererTest.withTypeParam +//internal trait Foo defined in rendererTest +//internal trait Bar defined in rendererTest +//internal final fun

funTypeParameterWithTwoUpperBounds() : jet.Int where P : rendererTest.Foo, P : rendererTest.Bar defined in rendererTest +//

defined in rendererTest.funTypeParameterWithTwoUpperBounds From 5ac866ba3c239c9bc3e5ea338b443df332c09297 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 11 May 2012 18:22:27 +0400 Subject: [PATCH 16/88] KT-1912 Formatter: smart indent doesn't work in a function literal #KT-1099 fixed #KT-1912 fixed --- .../org/jetbrains/jet/plugin/formatter/JetBlock.java | 3 ++- .../formatter/IndentationOnNewline/FunctionBlock.kt | 10 +++------- .../IndentationOnNewline/FunctionBlock_after.kt | 8 ++------ .../jet/formatter/JetTypingIndentationTest.java | 3 +-- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/JetBlock.java b/idea/src/org/jetbrains/jet/plugin/formatter/JetBlock.java index 5286b584591..0dcfca95f28 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/JetBlock.java +++ b/idea/src/org/jetbrains/jet/plugin/formatter/JetBlock.java @@ -46,7 +46,8 @@ public class JetBlock extends AbstractBlock { private static final TokenSet CODE_BLOCKS = TokenSet.create( JetNodeTypes.BLOCK, JetNodeTypes.CLASS_BODY, - JetNodeTypes.FUNCTION_LITERAL_EXPRESSION); + JetNodeTypes.FUNCTION_LITERAL_EXPRESSION, + JetNodeTypes.FUNCTION_LITERAL); // private static final List diff --git a/idea/testData/formatter/IndentationOnNewline/FunctionBlock.kt b/idea/testData/formatter/IndentationOnNewline/FunctionBlock.kt index 9a06cb4c001..c65baae700d 100644 --- a/idea/testData/formatter/IndentationOnNewline/FunctionBlock.kt +++ b/idea/testData/formatter/IndentationOnNewline/FunctionBlock.kt @@ -1,11 +1,7 @@ package testing -private fun times(times : Int, body : () -> T) { - for (var i in 1..times) { - body() - } -} +private fun times(times : Int, body : () -> T) {} fun main(args: Array) { - times(3) { -} + times(3) {} +} \ No newline at end of file diff --git a/idea/testData/formatter/IndentationOnNewline/FunctionBlock_after.kt b/idea/testData/formatter/IndentationOnNewline/FunctionBlock_after.kt index c9d693643da..f7b57785a17 100644 --- a/idea/testData/formatter/IndentationOnNewline/FunctionBlock_after.kt +++ b/idea/testData/formatter/IndentationOnNewline/FunctionBlock_after.kt @@ -1,13 +1,9 @@ package testing -private fun times(times : Int, body : () -> T) { - for (var i in 1..times) { - body() - } -} +private fun times(times : Int, body : () -> T) {} fun main(args: Array) { times(3) { } -} +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/formatter/JetTypingIndentationTest.java b/idea/tests/org/jetbrains/jet/formatter/JetTypingIndentationTest.java index df528a40841..5aec6c4bdf6 100644 --- a/idea/tests/org/jetbrains/jet/formatter/JetTypingIndentationTest.java +++ b/idea/tests/org/jetbrains/jet/formatter/JetTypingIndentationTest.java @@ -49,8 +49,7 @@ public class JetTypingIndentationTest extends LightCodeInsightTestCase { doFileNewlineTest(); } - // TODO - public void enabletestFunctionBlock() { + public void testFunctionBlock() { doFileNewlineTest(); } From 2dba348ecb6f5af22c2f5fb8c5b9be8d5df6a413 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 11 May 2012 18:58:54 +0400 Subject: [PATCH 17/88] Intermediate major refactorings for lazy resolve --- .../resolve/java/JavaDescriptorResolver.java | 84 +---- .../resolve/java/JavaNamespaceDescriptor.java | 3 +- .../jet/lang/descriptors/FqNamed.java | 29 ++ .../descriptors/MutableClassDescriptor.java | 138 +++++---- .../MutableClassDescriptorLite.java | 111 ++++--- .../lang/descriptors/NamespaceDescriptor.java | 2 +- .../descriptors/NamespaceDescriptorImpl.java | 90 ++++-- .../jet/lang/resolve/DeclarationResolver.java | 36 ++- .../jet/lang/resolve/DelegationResolver.java | 4 +- .../jet/lang/resolve/FqNameUnsafe.java | 4 +- .../lang/resolve/NamespaceFactoryImpl.java | 139 ++++++--- .../jet/lang/resolve/OverrideResolver.java | 4 +- .../lang/resolve/TopDownAnalysisContext.java | 12 +- .../jet/lang/resolve/TopDownAnalyzer.java | 6 +- .../lang/resolve/TypeHierarchyResolver.java | 288 +++++++++++++----- .../lang/types/lang/JetStandardClasses.java | 24 +- .../JetDefaultModalityModifiersTest.java | 2 +- 17 files changed, 603 insertions(+), 373 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FqNamed.java diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 8844466d01e..5ac681a0dc6 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -21,75 +21,15 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; -import com.intellij.psi.PsiAnnotation; -import com.intellij.psi.PsiAnnotationMemberValue; -import com.intellij.psi.PsiAnnotationMethod; -import com.intellij.psi.PsiAnnotationParameterList; -import com.intellij.psi.PsiArrayType; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiClassType; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiEllipsisType; -import com.intellij.psi.PsiLiteralExpression; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiModifierListOwner; -import com.intellij.psi.PsiNameValuePair; -import com.intellij.psi.PsiPackage; -import com.intellij.psi.PsiPrimitiveType; -import com.intellij.psi.PsiType; -import com.intellij.psi.PsiTypeParameter; -import com.intellij.psi.PsiTypeParameterListOwner; +import com.intellij.psi.*; import jet.typeinfo.TypeInfoVariance; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; -import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.ClassKind; -import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; -import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; -import org.jetbrains.jet.lang.descriptors.ConstructorDescriptorImpl; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorImpl; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptorImpl; -import org.jetbrains.jet.lang.descriptors.Modality; -import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; -import org.jetbrains.jet.lang.descriptors.MutableClassDescriptorLite; -import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; -import org.jetbrains.jet.lang.descriptors.NamespaceDescriptorParent; -import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; -import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor; -import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor; -import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptorImpl; -import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; -import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; -import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptorImpl; -import org.jetbrains.jet.lang.descriptors.VariableDescriptor; -import org.jetbrains.jet.lang.descriptors.Visibilities; -import org.jetbrains.jet.lang.descriptors.Visibility; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.JetPsiUtil; -import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.BindingContextUtils; -import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.resolve.DescriptorUtils; -import org.jetbrains.jet.lang.resolve.FqName; -import org.jetbrains.jet.lang.resolve.NamespaceFactory; -import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl; -import org.jetbrains.jet.lang.resolve.OverrideResolver; -import org.jetbrains.jet.lang.resolve.constants.ByteValue; -import org.jetbrains.jet.lang.resolve.constants.CharValue; -import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; -import org.jetbrains.jet.lang.resolve.constants.DoubleValue; -import org.jetbrains.jet.lang.resolve.constants.FloatValue; -import org.jetbrains.jet.lang.resolve.constants.IntValue; -import org.jetbrains.jet.lang.resolve.constants.LongValue; -import org.jetbrains.jet.lang.resolve.constants.NullValue; -import org.jetbrains.jet.lang.resolve.constants.ShortValue; +import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import org.jetbrains.jet.lang.types.*; @@ -101,14 +41,7 @@ import org.jetbrains.jet.rt.signature.JetSignatureReader; import org.jetbrains.jet.rt.signature.JetSignatureVisitor; import javax.inject.Inject; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author abreslav @@ -541,7 +474,7 @@ public class JavaDescriptorResolver { MutableClassDescriptorLite classObject = createClassObjectDescriptor(classData.classDescriptor, psiClass); if (classObject != null) { - classData.classDescriptor.setClassObjectDescriptor(classObject); + classData.classDescriptor.getBuilder().setClassObjectDescriptor(classObject); } trace.record(BindingContext.CLASS, psiClass, classData.classDescriptor); @@ -605,7 +538,8 @@ public class JavaDescriptorResolver { checkPsiClassIsNotJet(psiClass); FqName fqName = new FqName(classObjectPsiClass.getQualifiedName()); - ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, fqName, new MutableClassDescriptorLite(containing, ClassKind.OBJECT)); + ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, fqName, + new MutableClassDescriptorLite(containing, ClassKind.OBJECT)); classDescriptorCache.put(fqName, classData); @@ -994,7 +928,7 @@ public class JavaDescriptorResolver { JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor( parentNs, Collections.emptyList(), // TODO - qualifiedName.isRoot() ? "" : qualifiedName.shortName(), + qualifiedName.isRoot() ? FqNameUnsafe.ROOT_NAME : qualifiedName.shortName(), qualifiedName ); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaNamespaceDescriptor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaNamespaceDescriptor.java index f13982f0923..87eb5d32e0d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaNamespaceDescriptor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaNamespaceDescriptor.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve.java; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.AbstractNamespaceDescriptorImpl; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptorParent; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.FqName; @@ -49,6 +48,8 @@ public class JavaNamespaceDescriptor extends AbstractNamespaceDescriptorImpl { return memberScope; } + @NotNull + @Override public FqName getQualifiedName() { return qualifiedName; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FqNamed.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FqNamed.java new file mode 100644 index 00000000000..80300e463d7 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FqNamed.java @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2012 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.descriptors; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.FqName; + +/** + * @author Nikolay Krasko + */ +public interface FqNamed { + + @NotNull + FqName getQualifiedName(); +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 75cc71b057e..1dcbe098eff 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -46,8 +46,8 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { private final WritableScope scopeForSupertypeResolution; private WritableScope scopeForInitializers = null; //contains members + primary constructor value parameters + map for backing fields - public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, - @NotNull JetScope outerScope, ClassKind kind) { + public MutableClassDescriptor(@NotNull DeclarationDescriptor containingDeclaration, + @NotNull JetScope outerScope, ClassKind kind, String name) { super(containingDeclaration, kind); RedeclarationHandler redeclarationHandler = RedeclarationHandler.DO_NOTHING; @@ -64,38 +64,13 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { if (getKind() == ClassKind.TRAIT) { setUpScopeForInitializers(this); } + + setName(name); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - @Override - public ClassObjectStatus setClassObjectDescriptor(@NotNull final MutableClassDescriptorLite classObjectDescriptor) { - ClassObjectStatus r = super.setClassObjectDescriptor(classObjectDescriptor); - if (r != ClassObjectStatus.OK) { - return r; - } - - // Members of the class object are accessible from the class - // The scope must be lazy, because classObjectDescriptor may not by fully built yet - scopeForMemberResolution.importScope(new AbstractScopeAdapter() { - @NotNull - @Override - protected JetScope getWorkerScope() { - return classObjectDescriptor.getDefaultType().getMemberScope(); - } - - @NotNull - @Override - public ReceiverDescriptor getImplicitReceiver() { - return classObjectDescriptor.getImplicitReceiver(); - } - } - ); - - return ClassObjectStatus.OK; - } - @Override public void addConstructor(@NotNull ConstructorDescriptor constructorDescriptor, @NotNull BindingTrace trace) { super.addConstructor(constructorDescriptor, trace); @@ -111,28 +86,6 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { } } - @Override - public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) { - super.addPropertyDescriptor(propertyDescriptor); - properties.add(propertyDescriptor); - if (propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - declaredCallableMembers.add(propertyDescriptor); - } - allCallableMembers.add(propertyDescriptor); - scopeForMemberResolution.addPropertyDescriptor(propertyDescriptor); - } - - @Override - public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) { - super.addFunctionDescriptor(functionDescriptor); - functions.add(functionDescriptor); - if (functionDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - declaredCallableMembers.add(functionDescriptor); - } - allCallableMembers.add(functionDescriptor); - scopeForMemberResolution.addFunctionDescriptor(functionDescriptor); - } - @NotNull public Set getFunctions() { return functions; @@ -154,11 +107,6 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { } @Override - public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { - super.addClassifierDescriptor(classDescriptor); - scopeForMemberResolution.addClassifierDescriptor(classDescriptor); - } - public void setTypeParameterDescriptors(List typeParameters) { super.setTypeParameterDescriptors(typeParameters); for (TypeParameterDescriptor typeParameterDescriptor : typeParameters) { @@ -207,6 +155,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { this.scopeForInitializers = new WritableScopeImpl(scopeForMemberResolution, containingDeclaration, RedeclarationHandler.DO_NOTHING).setDebugName("Initializers").changeLockLevel(WritableScope.LockLevel.BOTH); } + @Override public void lockScopes() { super.lockScopes(); scopeForSupertypeResolution.changeLockLevel(WritableScope.LockLevel.READING); @@ -214,4 +163,81 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { getWritableScopeForInitializers().changeLockLevel(WritableScope.LockLevel.READING); } + private NamespaceLikeBuilder builder = null; + + @Override + public NamespaceLikeBuilder getBuilder() { + if (builder == null) { + final NamespaceLikeBuilder superBuilder = super.getBuilder(); + builder = new NamespaceLikeBuilderDummy() { + @NotNull + @Override + public DeclarationDescriptor getOwnerForChildren() { + return superBuilder.getOwnerForChildren(); + } + + @Override + public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) { + superBuilder.addObjectDescriptor(objectDescriptor); + } + + @Override + public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { + superBuilder.addClassifierDescriptor(classDescriptor); + scopeForMemberResolution.addClassifierDescriptor(classDescriptor); + } + + @Override + public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) { + superBuilder.addFunctionDescriptor(functionDescriptor); + functions.add(functionDescriptor); + if (functionDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + declaredCallableMembers.add(functionDescriptor); + } + allCallableMembers.add(functionDescriptor); + scopeForMemberResolution.addFunctionDescriptor(functionDescriptor); + } + + @Override + public ClassObjectStatus setClassObjectDescriptor(@NotNull final MutableClassDescriptorLite classObjectDescriptor) { + ClassObjectStatus r = superBuilder.setClassObjectDescriptor(classObjectDescriptor); + if (r != ClassObjectStatus.OK) { + return r; + } + + // Members of the class object are accessible from the class + // The scope must be lazy, because classObjectDescriptor may not by fully built yet + scopeForMemberResolution.importScope(new AbstractScopeAdapter() { + @NotNull + @Override + protected JetScope getWorkerScope() { + return classObjectDescriptor.getDefaultType().getMemberScope(); + } + + @NotNull + @Override + public ReceiverDescriptor getImplicitReceiver() { + return classObjectDescriptor.getImplicitReceiver(); + } + } + ); + + return ClassObjectStatus.OK; + } + + @Override + public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) { + superBuilder.addPropertyDescriptor(propertyDescriptor); + properties.add(propertyDescriptor); + if (propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + declaredCallableMembers.add(propertyDescriptor); + } + allCallableMembers.add(propertyDescriptor); + scopeForMemberResolution.addPropertyDescriptor(propertyDescriptor); + } + }; + } + + return builder; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java index bd5bf229f73..9bb02dd6420 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java @@ -36,7 +36,8 @@ import java.util.*; /** * @author Stepan Koltsov */ -public class MutableClassDescriptorLite extends MutableDeclarationDescriptor implements ClassDescriptor, NamespaceLikeBuilder { +public class MutableClassDescriptorLite extends MutableDeclarationDescriptor + implements ClassDescriptor, WithDeferredResolve { private ConstructorDescriptor primaryConstructor; private final Set constructors = Sets.newLinkedHashSet(); @@ -60,11 +61,21 @@ public class MutableClassDescriptorLite extends MutableDeclarationDescriptor imp private ClassReceiver implicitReceiver; - public MutableClassDescriptorLite(@NotNull DeclarationDescriptor containingDeclaration, ClassKind kind) { + public MutableClassDescriptorLite(@NotNull DeclarationDescriptor containingDeclaration, + @NotNull ClassKind kind) { super(containingDeclaration); this.kind = kind; } + @Override + public void forceResolve() { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean isAlreadyResolved() { + return false; //To change body of implemented methods use File | Settings | File Templates. + } private static boolean isStatic(DeclarationDescriptor declarationDescriptor) { if (declarationDescriptor instanceof NamespaceDescriptor) { @@ -79,29 +90,6 @@ public class MutableClassDescriptorLite extends MutableDeclarationDescriptor imp } } - - @NotNull - @Override - public DeclarationDescriptor getOwnerForChildren() { - return this; - } - - @Override - public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) { - if (this.classObjectDescriptor != null) return ClassObjectStatus.DUPLICATE; - if (!isStatic(this.getContainingDeclaration())) { - return ClassObjectStatus.NOT_ALLOWED; - } - assert classObjectDescriptor.getKind() == ClassKind.OBJECT; - this.classObjectDescriptor = classObjectDescriptor; - - return ClassObjectStatus.OK; - } - - - - - @NotNull @Override public TypeConstructor getTypeConstructor() { @@ -258,20 +246,7 @@ public class MutableClassDescriptorLite extends MutableDeclarationDescriptor imp return classObjectDescriptor; } - @Override - public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) { - getScopeForMemberLookupAsWritableScope().addPropertyDescriptor(propertyDescriptor); - } - @Override - public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) { - getScopeForMemberLookupAsWritableScope().addFunctionDescriptor(functionDescriptor); - } - - @Override - public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { - getScopeForMemberLookupAsWritableScope().addClassifierDescriptor(classDescriptor); - } @NotNull @Override @@ -279,11 +254,6 @@ public class MutableClassDescriptorLite extends MutableDeclarationDescriptor imp return innerClassesScope; } - @Override - public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) { - getScopeForMemberLookupAsWritableScope().addObjectDescriptor(objectDescriptor); - } - public void addSupertype(@NotNull JetType supertype) { if (!ErrorUtils.isErrorType(supertype)) { if (TypeUtils.getClassDescriptor(supertype) != null) { @@ -341,4 +311,59 @@ public class MutableClassDescriptorLite extends MutableDeclarationDescriptor imp public void setAnnotations(List annotations) { this.annotations = annotations; } + + private NamespaceLikeBuilder builder = null; + public NamespaceLikeBuilder getBuilder() { + if (builder == null) { + builder = new NamespaceLikeBuilderDummy() { + @NotNull + @Override + public DeclarationDescriptor getOwnerForChildren() { + return MutableClassDescriptorLite.this; + } + + @Override + public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { + getScopeForMemberLookupAsWritableScope().addClassifierDescriptor(classDescriptor); + } + + @Override + public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) { + getScopeForMemberLookupAsWritableScope().addObjectDescriptor(objectDescriptor); + } + + @Override + public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) { + getScopeForMemberLookupAsWritableScope().addFunctionDescriptor(functionDescriptor); + } + + @Override + public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) { + getScopeForMemberLookupAsWritableScope().addPropertyDescriptor(propertyDescriptor); + } + + @Override + public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) { + if (getKind() == ClassKind.OBJECT) { + return ClassObjectStatus.NOT_ALLOWED; + } + + if (MutableClassDescriptorLite.this.classObjectDescriptor != null) { + return ClassObjectStatus.DUPLICATE; + } + + if (!isStatic(MutableClassDescriptorLite.this.getContainingDeclaration())) { + return ClassObjectStatus.NOT_ALLOWED; + } + + assert classObjectDescriptor.getKind() == ClassKind.OBJECT; + MutableClassDescriptorLite.this.classObjectDescriptor = classObjectDescriptor; + + return ClassObjectStatus.OK; + } + }; + } + + return builder; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptor.java index 5aafdb2db18..bfc32403e32 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptor.java @@ -24,7 +24,7 @@ import org.jetbrains.jet.lang.types.NamespaceType; /** * @author abreslav */ -public interface NamespaceDescriptor extends Annotated, Named, ClassOrNamespaceDescriptor, NamespaceDescriptorParent { +public interface NamespaceDescriptor extends Annotated, Named, FqNamed, ClassOrNamespaceDescriptor, NamespaceDescriptorParent { @NotNull JetScope getMemberScope(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java index d5d60a00eab..9cc6c0360b8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java @@ -17,7 +17,10 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import java.util.List; @@ -25,7 +28,7 @@ import java.util.List; /** * @author abreslav */ -public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl implements NamespaceLikeBuilder { +public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl implements WithDeferredResolve { private WritableScope memberScope; @@ -36,13 +39,11 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp } public void initialize(@NotNull WritableScope memberScope) { - this.memberScope = memberScope; - } + if (this.memberScope != null) { + throw new IllegalStateException("Namespace member scope reinitialize"); + } - @NotNull - @Override - public DeclarationDescriptor getOwnerForChildren() { - return this; + this.memberScope = memberScope; } @Override @@ -51,37 +52,64 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp return memberScope; } - public NamespaceDescriptorImpl getNamespace(String name) { - return (NamespaceDescriptorImpl) memberScope.getDeclaredNamespace(name); - } - @Override public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) { - memberScope.addNamespace(namespaceDescriptor); + getMemberScope().addNamespace(namespaceDescriptor); + } + + @NotNull + @Override + public FqName getQualifiedName() { + return DescriptorUtils.getFQName(this).toSafe(); + } + + private NamespaceLikeBuilder builder = null; + public NamespaceLikeBuilder getBuilder() { + if (builder == null) { + builder = new NamespaceLikeBuilder() { + @Override + public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { + getMemberScope().addClassifierDescriptor(classDescriptor); + } + + @Override + public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) { + getMemberScope().addObjectDescriptor(objectDescriptor); + } + + @Override + public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) { + getMemberScope().addFunctionDescriptor(functionDescriptor); + } + + @Override + public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) { + getMemberScope().addPropertyDescriptor(propertyDescriptor); + } + + @NotNull + @Override + public DeclarationDescriptor getOwnerForChildren() { + return NamespaceDescriptorImpl.this; + } + + @Override + public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) { + throw new IllegalStateException("Must be guaranteed not to happen by the parser"); + } + }; + } + + return builder; } @Override - public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { - memberScope.addClassifierDescriptor(classDescriptor); + public void forceResolve() { + //To change body of implemented methods use File | Settings | File Templates. } @Override - public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) { - memberScope.addObjectDescriptor(objectDescriptor); - } - - @Override - public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) { - memberScope.addFunctionDescriptor(functionDescriptor); - } - - @Override - public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) { - memberScope.addPropertyDescriptor(propertyDescriptor); - } - - @Override - public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) { - throw new IllegalStateException("Must be guaranteed not to happen by the parser"); + public boolean isAlreadyResolved() { + return false; //To change body of implemented methods use File | Settings | File Templates. } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 26ce64163e1..684b8df60de 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -34,9 +34,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import static org.jetbrains.jet.lang.diagnostics.Errors.CONSTRUCTOR_IN_TRAIT; -import static org.jetbrains.jet.lang.diagnostics.Errors.REDECLARATION; -import static org.jetbrains.jet.lang.diagnostics.Errors.SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED; +import static org.jetbrains.jet.lang.diagnostics.Errors.*; /** * @author abreslav @@ -127,7 +125,7 @@ public class DeclarationResolver { for (Map.Entry entry : context.getNamespaceScopes().entrySet()) { JetFile namespace = entry.getKey(); WritableScope namespaceScope = entry.getValue(); - NamespaceLikeBuilder namespaceDescriptor = context.getNamespaceDescriptors().get(namespace); + NamespaceLikeBuilder namespaceDescriptor = context.getNamespaceDescriptors().get(namespace).getBuilder(); resolveFunctionAndPropertyHeaders(namespace.getDeclarations(), namespaceScope, namespaceScope, namespaceScope, namespaceDescriptor); } @@ -135,13 +133,14 @@ public class DeclarationResolver { JetClass jetClass = entry.getKey(); MutableClassDescriptor classDescriptor = entry.getValue(); - resolveFunctionAndPropertyHeaders(jetClass.getDeclarations(), classDescriptor.getScopeForMemberResolution(), + resolveFunctionAndPropertyHeaders( + jetClass.getDeclarations(), classDescriptor.getScopeForMemberResolution(), classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(), - classDescriptor); -// processPrimaryConstructor(classDescriptor, jetClass); -// for (JetSecondaryConstructor jetConstructor : jetClass.getSecondaryConstructors()) { -// processSecondaryConstructor(classDescriptor, jetConstructor); -// } + classDescriptor.getBuilder()); + // processPrimaryConstructor(classDescriptor, jetClass); + // for (JetSecondaryConstructor jetConstructor : jetClass.getSecondaryConstructors()) { + // processSecondaryConstructor(classDescriptor, jetConstructor); + // } } for (Map.Entry entry : context.getObjects().entrySet()) { JetObjectDeclaration object = entry.getKey(); @@ -149,7 +148,7 @@ public class DeclarationResolver { resolveFunctionAndPropertyHeaders(object.getDeclarations(), classDescriptor.getScopeForMemberResolution(), classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(), - classDescriptor); + classDescriptor.getBuilder()); } // TODO : Extensions @@ -186,17 +185,22 @@ public class DeclarationResolver { @Override public void visitObjectDeclaration(JetObjectDeclaration declaration) { - PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor(namespaceLike.getOwnerForChildren(), declaration, context.getObjects().get(declaration), trace); + PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor( + namespaceLike.getOwnerForChildren(), declaration, context.getObjects().get(declaration), trace); + namespaceLike.addPropertyDescriptor(propertyDescriptor); } @Override public void visitEnumEntry(JetEnumEntry enumEntry) { if (enumEntry.getPrimaryConstructorParameterList() == null) { - MutableClassDescriptorLite classObjectDescriptor = ((MutableClassDescriptor) namespaceLike).getClassObjectDescriptor(); + // FIX: Bad cast + MutableClassDescriptorLite classObjectDescriptor = + ((MutableClassDescriptorLite)namespaceLike.getOwnerForChildren()).getClassObjectDescriptor(); assert classObjectDescriptor != null; - PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor(classObjectDescriptor, enumEntry, context.getClasses().get(enumEntry), trace); - classObjectDescriptor.addPropertyDescriptor(propertyDescriptor); + PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor( + classObjectDescriptor, enumEntry, context.getClasses().get(enumEntry), trace); + classObjectDescriptor.getBuilder().addPropertyDescriptor(propertyDescriptor); } } }); @@ -222,7 +226,7 @@ public class DeclarationResolver { memberScope, parameter, trace ); - classDescriptor.addPropertyDescriptor(propertyDescriptor); + classDescriptor.getBuilder().addPropertyDescriptor(propertyDescriptor); context.getPrimaryConstructorParameterProperties().put(parameter, propertyDescriptor); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java index 102cf6f271e..02b5326aa21 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java @@ -72,7 +72,7 @@ public class DelegationResolver { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) declarationDescriptor; if (propertyDescriptor.getModality().isOverridable()) { PropertyDescriptor copy = propertyDescriptor.copy(classDescriptor, true, CallableMemberDescriptor.Kind.DELEGATION, true); - classDescriptor.addPropertyDescriptor(copy); + classDescriptor.getBuilder().addPropertyDescriptor(copy); trace.record(DELEGATED, copy); } } @@ -80,7 +80,7 @@ public class DelegationResolver { SimpleFunctionDescriptor functionDescriptor = (SimpleFunctionDescriptor) declarationDescriptor; if (functionDescriptor.getModality().isOverridable()) { SimpleFunctionDescriptor copy = functionDescriptor.copy(classDescriptor, true, CallableMemberDescriptor.Kind.DELEGATION, true); - classDescriptor.addFunctionDescriptor(copy); + classDescriptor.getBuilder().addFunctionDescriptor(copy); trace.record(DELEGATED, copy); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java index ceb0222edf2..2671f5e606d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FqNameUnsafe.java @@ -29,6 +29,8 @@ import java.util.List; */ public class FqNameUnsafe { + public static final String ROOT_NAME = ""; + @NotNull private final String fqName; @@ -246,7 +248,7 @@ public class FqNameUnsafe { @Override public String toString() { - return isRoot() ? "" : fqName; + return isRoot() ? ROOT_NAME : fqName; } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java index f1c0c8dd9bd..7b50e5601a8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.Sets; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.ModuleConfiguration; @@ -61,14 +62,17 @@ public class NamespaceFactoryImpl implements NamespaceFactory { this.configuration = configuration; } - public NamespaceDescriptorImpl createNamespaceDescriptorPathIfNeeded(JetFile file, JetScope outerScope) { + @NotNull + public NamespaceDescriptorImpl createNamespaceDescriptorPathIfNeeded(@NotNull JetFile file, + @NotNull JetScope outerScope, + @NotNull RedeclarationHandler handler) { JetNamespaceHeader namespaceHeader = file.getNamespaceHeader(); if (moduleDescriptor.getRootNs() == null) { - createNamespaceDescriptorIfNeeded(null, moduleDescriptor, "", true, null); + createRootNamespaceDescriptorIfNeeded(null, moduleDescriptor, null, handler); } - NamespaceDescriptorParent currentOwner = moduleDescriptor.getRootNs(); + NamespaceDescriptorImpl currentOwner = moduleDescriptor.getRootNs(); if (currentOwner == null) { throw new IllegalStateException("must be initialized 5 lines above"); } @@ -77,7 +81,7 @@ public class NamespaceFactoryImpl implements NamespaceFactory { String namespaceName = JetPsiUtil.safeName(nameExpression.getReferencedName()); NamespaceDescriptorImpl namespaceDescriptor = createNamespaceDescriptorIfNeeded( - null, currentOwner, namespaceName, false, nameExpression); + null, currentOwner, namespaceName, nameExpression, handler); trace.record(BindingContext.NAMESPACE_IS_SRC, namespaceDescriptor, true); trace.record(RESOLUTION_SCOPE, nameExpression, outerScope); @@ -89,13 +93,14 @@ public class NamespaceFactoryImpl implements NamespaceFactory { NamespaceDescriptorImpl namespaceDescriptor; String name; if (namespaceHeader.isRoot()) { - // again to register file in trace - namespaceDescriptor = createNamespaceDescriptorIfNeeded(file, moduleDescriptor, "", true, null); + // previous call to createRootNamespaceDescriptorIfNeeded couldn't store occurrence for current file. + namespaceDescriptor = moduleDescriptor.getRootNs(); + storeBindingForFileAndExpression(file, null, namespaceDescriptor); } else { name = namespaceHeader.getName(); - namespaceDescriptor = createNamespaceDescriptorIfNeeded(file, currentOwner, name, namespaceHeader.isRoot(), - namespaceHeader.getLastPartExpression()); + namespaceDescriptor = createNamespaceDescriptorIfNeeded( + file, currentOwner, name, namespaceHeader.getLastPartExpression(), handler); trace.record(BindingContext.NAMESPACE_IS_SRC, namespaceDescriptor, true); trace.record(RESOLUTION_SCOPE, namespaceHeader, outerScope); @@ -107,49 +112,95 @@ public class NamespaceFactoryImpl implements NamespaceFactory { @Override @NotNull public NamespaceDescriptorImpl createNamespaceDescriptorPathIfNeeded(@NotNull FqName fqName) { - NamespaceDescriptorParent owner = moduleDescriptor; + NamespaceDescriptorImpl owner = null; for (FqName pathElement : fqName.path()) { - owner = createNamespaceDescriptorIfNeeded(null, - owner, pathElement.isRoot() ? "" : pathElement.shortName(), pathElement.isRoot(), null); + if (pathElement.isRoot()) { + owner = createRootNamespaceDescriptorIfNeeded(null, + moduleDescriptor, + null, + RedeclarationHandler.DO_NOTHING); + } + else { + assert owner != null : "Should never be null as first element in the path must be root"; + owner = createNamespaceDescriptorIfNeeded(null, + owner, + pathElement.shortName(), + null, + RedeclarationHandler.DO_NOTHING); + } + } - return (NamespaceDescriptorImpl) owner; + + assert owner != null : "Should never be null as first element in the path must be root"; + return owner; + } + + private NamespaceDescriptorImpl createRootNamespaceDescriptorIfNeeded(@Nullable JetFile file, + @NotNull ModuleDescriptor owner, + @Nullable JetReferenceExpression expression, + @NotNull RedeclarationHandler handler) { + FqName fqName = FqName.ROOT; + NamespaceDescriptorImpl namespaceDescriptor = owner.getRootNs(); + + if (namespaceDescriptor == null) { + namespaceDescriptor = createNewNamespaceDescriptor(owner, FqNameUnsafe.ROOT_NAME, expression, handler, fqName); + } + + storeBindingForFileAndExpression(file, expression, namespaceDescriptor); + + return namespaceDescriptor; } @NotNull - public NamespaceDescriptorImpl createNamespaceDescriptorIfNeeded(@Nullable JetFile file, - @NotNull NamespaceDescriptorParent owner, @NotNull String name, boolean root, @Nullable JetReferenceExpression expression) { - FqName fqName; - NamespaceDescriptorImpl namespaceDescriptor; - if (root) { - if (!(owner instanceof ModuleDescriptor)) { - throw new IllegalStateException(); - } - fqName = FqName.ROOT; - namespaceDescriptor = ((ModuleDescriptor) owner).getRootNs(); - } - else { - FqName ownerFqName = DescriptorUtils.getFQName(owner).toSafe(); - fqName = ownerFqName.child(name); - namespaceDescriptor = ((NamespaceDescriptorImpl) owner).getNamespace(name); - } + private NamespaceDescriptorImpl createNamespaceDescriptorIfNeeded(@Nullable JetFile file, + @NotNull NamespaceDescriptorImpl owner, + @NotNull String name, + @Nullable JetReferenceExpression expression, + @NotNull RedeclarationHandler handler) { + FqName ownerFqName = DescriptorUtils.getFQName(owner).toSafe(); + FqName fqName = ownerFqName.child(name); + // !!! + NamespaceDescriptorImpl namespaceDescriptor = (NamespaceDescriptorImpl) owner.getMemberScope().getDeclaredNamespace(name); if (namespaceDescriptor == null) { - namespaceDescriptor = new NamespaceDescriptorImpl( - owner, - Collections.emptyList(), // TODO: annotations - name - ); - trace.record(FQNAME_TO_NAMESPACE_DESCRIPTOR, fqName, namespaceDescriptor); - WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, namespaceDescriptor, RedeclarationHandler.DO_NOTHING).setDebugName("Namespace member scope"); - scope.changeLockLevel(WritableScope.LockLevel.BOTH); - namespaceDescriptor.initialize(scope); - configuration.extendNamespaceScope(trace, namespaceDescriptor, scope); - owner.addNamespace(namespaceDescriptor); - if (expression != null) { - trace.record(BindingContext.NAMESPACE, expression, namespaceDescriptor); - } + namespaceDescriptor = createNewNamespaceDescriptor(owner, name, expression, handler, fqName); } + storeBindingForFileAndExpression(file, expression, namespaceDescriptor); + + return namespaceDescriptor; + } + + private NamespaceDescriptorImpl createNewNamespaceDescriptor(NamespaceDescriptorParent owner, + String name, + PsiElement expression, + RedeclarationHandler handler, + FqName fqName) { + NamespaceDescriptorImpl namespaceDescriptor; + namespaceDescriptor = new NamespaceDescriptorImpl( + owner, + Collections.emptyList(), // TODO: annotations + name + ); + trace.record(FQNAME_TO_NAMESPACE_DESCRIPTOR, fqName, namespaceDescriptor); + + WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, namespaceDescriptor, handler).setDebugName("Namespace member scope"); + scope.changeLockLevel(WritableScope.LockLevel.BOTH); + + namespaceDescriptor.initialize(scope); + scope.changeLockLevel(WritableScope.LockLevel.BOTH); + // + configuration.extendNamespaceScope(trace, namespaceDescriptor, scope); + owner.addNamespace(namespaceDescriptor); + if (expression != null) { + trace.record(BindingContext.NAMESPACE, expression, namespaceDescriptor); + } + return namespaceDescriptor; + } + + private void storeBindingForFileAndExpression(@Nullable JetFile file, + @Nullable JetReferenceExpression expression, + @NotNull NamespaceDescriptor namespaceDescriptor) { if (expression != null) { trace.record(REFERENCE_TARGET, expression, namespaceDescriptor); } @@ -166,9 +217,5 @@ public class NamespaceFactoryImpl implements NamespaceFactory { files.add(file); trace.record(BindingContext.NAMESPACE_TO_FILES, namespaceDescriptor, files); } - - return namespaceDescriptor; } - - } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 8a8a521cc7a..d3008c4364e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -138,10 +138,10 @@ public class OverrideResolver { @Override public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) { if (fakeOverride instanceof PropertyDescriptor) { - classDescriptor.addPropertyDescriptor((PropertyDescriptor) fakeOverride); + classDescriptor.getBuilder().addPropertyDescriptor((PropertyDescriptor) fakeOverride); } else if (fakeOverride instanceof SimpleFunctionDescriptor) { - classDescriptor.addFunctionDescriptor((SimpleFunctionDescriptor) fakeOverride); + classDescriptor.getBuilder().addFunctionDescriptor((SimpleFunctionDescriptor) fakeOverride); } else { throw new IllegalStateException(fakeOverride.getClass().getName()); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java index 6f7c088fae8..e9afa155b33 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.lang.resolve; -import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.intellij.psi.PsiElement; @@ -30,7 +29,6 @@ import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import javax.inject.Inject; import java.io.PrintStream; import java.util.Map; -import java.util.Set; /** * @author abreslav @@ -39,7 +37,6 @@ public class TopDownAnalysisContext { private final Map classes = Maps.newLinkedHashMap(); private final Map objects = Maps.newLinkedHashMap(); - protected final Map namespaceScopes = Maps.newHashMap(); private JetScope rootScope; protected final Map namespaceDescriptors = Maps.newHashMap(); @@ -50,6 +47,13 @@ public class TopDownAnalysisContext { private final Map primaryConstructorParameterProperties = Maps.newHashMap(); private Map members = null; + // File scopes - package scope extended with imports + protected final Map namespaceScopes = Maps.newHashMap(); + + public final Map forDeferredResolver = Maps.newHashMap(); + + public final Map normalScope = Maps.newHashMap(); + private StringBuilder debugOutput; @@ -68,7 +72,7 @@ public class TopDownAnalysisContext { debugOutput.append(message).append("\n"); } } - + /*package*/ void enableDebugOutput() { if (debugOutput == null) { debugOutput = new StringBuilder(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 597d0ffe38e..ec6d73ee855 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -199,7 +199,7 @@ public class TopDownAnalyzer { } // context.getDeclaringScopes().put(file, outerScope); - doProcess(outerScope, standardLibraryNamespace, toAnalyze); + doProcess(outerScope, standardLibraryNamespace.getBuilder(), toAnalyze); } public static void processObject( @@ -207,8 +207,8 @@ public class TopDownAnalyzer { @NotNull final BindingTrace trace, @NotNull JetScope outerScope, @NotNull final DeclarationDescriptor containingDeclaration, - @NotNull JetObjectDeclaration object) { - + @NotNull JetObjectDeclaration object + ) { ModuleDescriptor moduleDescriptor = new ModuleDescriptor(""); TopDownAnalysisParameters topDownAnalysisParameters = diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 6135ed5a0a0..b14137e3621 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -27,9 +27,13 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WriteThroughScope; -import org.jetbrains.jet.lang.types.*; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.SubstitutionUtils; +import org.jetbrains.jet.lang.types.TypeConstructor; +import org.jetbrains.jet.lang.types.TypeProjection; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lexer.JetTokens; @@ -82,11 +86,42 @@ public class TypeHierarchyResolver { this.trace = trace; } - - - public void process(@NotNull JetScope outerScope, @NotNull NamespaceLikeBuilder owner, @NotNull Collection declarations) { + public void process(@NotNull JetScope outerScope, @NotNull NamespaceLikeBuilder owner, + @NotNull Collection declarations) { context.setRootScope(outerScope); - collectNamespacesAndClassifiers(outerScope, outerScope, owner, declarations); // namespaceScopes, classes + + { + // TODO: Very temp code - main goal is to remove recursion from collectNamespacesAndClassifiers + Queue forDeferredResolve = new LinkedList(); + forDeferredResolve.addAll(collectNamespacesAndClassifiers(outerScope, owner, declarations)); + + while (!forDeferredResolve.isEmpty()) { + JetDeclarationContainer declarationContainer = forDeferredResolve.poll(); + assert declarationContainer != null; + + WithDeferredResolve descriptorForDeferredResolve = context.forDeferredResolver.get(declarationContainer); + JetScope scope = context.normalScope.get(declarationContainer); + + // Even more temp code + if (descriptorForDeferredResolve instanceof MutableClassDescriptorLite) { + forDeferredResolve.addAll( + collectNamespacesAndClassifiers( + scope, + ((MutableClassDescriptorLite) descriptorForDeferredResolve).getBuilder(), + declarationContainer.getDeclarations())); + } + else if (descriptorForDeferredResolve instanceof NamespaceDescriptorImpl) { + forDeferredResolve.addAll( + collectNamespacesAndClassifiers( + scope, + ((NamespaceDescriptorImpl) descriptorForDeferredResolve).getBuilder(), + declarationContainer.getDeclarations())); + } + else { + assert false; + } + } + } importsResolver.processTypeImports(); @@ -106,105 +141,111 @@ public class TypeHierarchyResolver { checkTypesInClassHeaders(); // Check bounds in the types used in generic bounds and supertype lists } - private void collectNamespacesAndClassifiers( + /** + * Use nearest class object scope or namespace scope + * + * @param declarationElement + * @param owner + * @return + */ + @NotNull + private JetScope getStaticScope(PsiElement declarationElement, @NotNull NamespaceLikeBuilder owner) { + DeclarationDescriptor ownerDescriptor = owner.getOwnerForChildren(); + if (ownerDescriptor instanceof NamespaceDescriptorImpl) { + return context.getNamespaceScopes().get(declarationElement.getContainingFile()); + } + + if (ownerDescriptor instanceof MutableClassDescriptor) { + MutableClassDescriptor classDescriptor = (MutableClassDescriptor) ownerDescriptor; + if (classDescriptor.getKind() == ClassKind.OBJECT) { + return classDescriptor.getScopeForMemberResolution(); + } + + DeclarationDescriptor declaration = classDescriptor.getContainingDeclaration(); + if (declaration instanceof NamespaceDescriptorImpl) { + return getStaticScope(declarationElement, ((NamespaceDescriptorImpl)declaration).getBuilder()); + } + + if (declaration instanceof MutableClassDescriptorLite) { + return getStaticScope(declarationElement, ((MutableClassDescriptorLite)declaration).getBuilder()); + } + } + + return null; + } + + @Nullable + private Collection collectNamespacesAndClassifiers( @NotNull final JetScope outerScope, - @NotNull final JetScope outerScopeForStatic, @NotNull final NamespaceLikeBuilder owner, - @NotNull Collection declarations) { + @NotNull Iterable declarations + ) { + final Collection forDeferredResolve = new ArrayList(); + for (PsiElement declaration : declarations) { declaration.accept(new JetVisitorVoid() { @Override public void visitJetFile(JetFile file) { - NamespaceDescriptorImpl namespaceDescriptor = namespaceFactory.createNamespaceDescriptorPathIfNeeded(file, outerScope); + NamespaceDescriptorImpl namespaceDescriptor = namespaceFactory.createNamespaceDescriptorPathIfNeeded( + file, outerScope, RedeclarationHandler.DO_NOTHING); context.getNamespaceDescriptors().put(file, namespaceDescriptor); - WriteThroughScope namespaceScope = new WriteThroughScope(outerScope, namespaceDescriptor.getMemberScope(), new TraceBasedRedeclarationHandler(trace)); + WriteThroughScope namespaceScope = new WriteThroughScope(outerScope, namespaceDescriptor.getMemberScope(), + new TraceBasedRedeclarationHandler(trace)); namespaceScope.changeLockLevel(WritableScope.LockLevel.BOTH); context.getNamespaceScopes().put(file, namespaceScope); - collectNamespacesAndClassifiers(namespaceScope, namespaceScope, namespaceDescriptor, file.getDeclarations()); + prepareForDeferredCall(namespaceScope, namespaceDescriptor, file); } @Override public void visitClass(JetClass klass) { - MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner.getOwnerForChildren(), outerScope, getClassKind(klass)); + MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor( + owner.getOwnerForChildren(), outerScope, getClassKind(klass), JetPsiUtil.safeName(klass.getName())); + context.getClasses().put(klass, mutableClassDescriptor); trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(klass), mutableClassDescriptor); - if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) { - MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(trace, mutableClassDescriptor, outerScope, ClassKind.OBJECT); - classObjectDescriptor.setName("class-object-for-" + klass.getName()); - classObjectDescriptor.setModality(Modality.FINAL); - classObjectDescriptor.setVisibility(DescriptorResolver.resolveVisibilityFromModifiers(klass.getModifierList())); - classObjectDescriptor.setTypeParameterDescriptors(new ArrayList(0)); - classObjectDescriptor.createTypeConstructor(); - createPrimaryConstructorForObject(null, classObjectDescriptor); - mutableClassDescriptor.setClassObjectDescriptor(classObjectDescriptor); - } + createClassObjectForEnumClass(klass, mutableClassDescriptor); - visitClassOrObject(klass, (Map) context.getClasses(), mutableClassDescriptor); + JetScope classScope = mutableClassDescriptor.getScopeForMemberResolution(); + + prepareForDeferredCall(classScope, mutableClassDescriptor, klass); owner.addClassifierDescriptor(mutableClassDescriptor); } @Override public void visitObjectDeclaration(JetObjectDeclaration declaration) { - final MutableClassDescriptor objectDescriptor = createClassDescriptorForObject(declaration, owner, outerScope, ClassKind.OBJECT); + final MutableClassDescriptor objectDescriptor = createClassDescriptorForObject(declaration, owner, outerScope); trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(declaration), objectDescriptor); } @Override public void visitEnumEntry(JetEnumEntry enumEntry) { - MutableClassDescriptorLite classObjectDescriptor = ((MutableClassDescriptor) owner).getClassObjectDescriptor(); + // TODO: Bad casting + MutableClassDescriptorLite ownerClassDescriptor = (MutableClassDescriptorLite) owner.getOwnerForChildren(); + MutableClassDescriptorLite classObjectDescriptor = ownerClassDescriptor.getClassObjectDescriptor(); + assert classObjectDescriptor != null : enumEntry.getParent().getText(); if (enumEntry.getPrimaryConstructorParameterList() == null) { - createClassDescriptorForObject(enumEntry, classObjectDescriptor, outerScopeForStatic, ClassKind.ENUM_ENTRY); - return; + // Simple enum entry + + createClassDescriptorForEnumEntry(enumEntry, classObjectDescriptor.getBuilder()); } - MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, classObjectDescriptor, outerScope, ClassKind.ENUM_ENTRY); - visitClassOrObject( - enumEntry, - (Map) context.getClasses(), - mutableClassDescriptor - ); - classObjectDescriptor.addObjectDescriptor(mutableClassDescriptor); - } + else { + // Advanced enum entry like "Cons(val head : T, val tail : List) : List(tail.size + 1)" + MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor( + classObjectDescriptor, outerScope, ClassKind.ENUM_ENTRY, JetPsiUtil.safeName(enumEntry.getName())); + context.getClasses().put(enumEntry, mutableClassDescriptor); - private MutableClassDescriptor createClassDescriptorForObject(@NotNull JetClassOrObject declaration, @NotNull NamespaceLikeBuilder owner, JetScope scope, ClassKind classKind) { - MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner.getOwnerForChildren(), scope, classKind) { - @Override - public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) { - return ClassObjectStatus.NOT_ALLOWED; - } - }; - Map map = classKind == ClassKind.OBJECT ? (Map) context.getObjects() : (Map) context.getClasses(); - visitClassOrObject(declaration, map, mutableClassDescriptor); - createPrimaryConstructorForObject((JetDeclaration) declaration, mutableClassDescriptor); - owner.addObjectDescriptor(mutableClassDescriptor); - trace.record(BindingContext.CLASS, declaration, mutableClassDescriptor); - return mutableClassDescriptor; - } + JetScope classScope = mutableClassDescriptor.getScopeForMemberResolution(); - private void createPrimaryConstructorForObject(@Nullable JetDeclaration object, MutableClassDescriptor mutableClassDescriptor) { - ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(mutableClassDescriptor, Collections.emptyList(), true); - constructorDescriptor.initialize(Collections.emptyList(), Collections.emptyList(), - Visibilities.INTERNAL);//TODO check set mutableClassDescriptor.getVisibility() - // TODO : make the constructor private? - mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor, trace); - if (object != null) { - trace.record(CONSTRUCTOR, object, constructorDescriptor); + prepareForDeferredCall(classScope, mutableClassDescriptor, enumEntry); + + classObjectDescriptor.getBuilder().addObjectDescriptor(mutableClassDescriptor); } } - private void visitClassOrObject(@NotNull JetClassOrObject declaration, Map map, MutableClassDescriptor mutableClassDescriptor) { - mutableClassDescriptor.setName(JetPsiUtil.safeName(declaration.getName())); - - map.put(declaration, mutableClassDescriptor); - - JetScope classScope = mutableClassDescriptor.getScopeForMemberResolution(); - JetScope scopeForStatic = declaration instanceof JetObjectDeclaration ? classScope : outerScopeForStatic; - collectNamespacesAndClassifiers(classScope, scopeForStatic, mutableClassDescriptor, declaration.getDeclarations()); - } - @Override public void visitTypedef(JetTypedef typedef) { trace.report(UNSUPPORTED.on(typedef, "TypeHierarchyResolver")); @@ -214,7 +255,8 @@ public class TypeHierarchyResolver { public void visitClassObject(JetClassObject classObject) { JetObjectDeclaration objectDeclaration = classObject.getObjectDeclaration(); if (objectDeclaration != null) { - NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(createClassDescriptorForObject(objectDeclaration, owner, outerScopeForStatic, ClassKind.OBJECT)); + MutableClassDescriptor classObjectDescriptor = createClassDescriptorForObject(objectDeclaration, owner, getStaticScope(classObject, owner)); + NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(classObjectDescriptor); switch (status) { case DUPLICATE: trace.report(MANY_CLASS_OBJECTS.on(classObject)); @@ -222,15 +264,87 @@ public class TypeHierarchyResolver { case NOT_ALLOWED: trace.report(CLASS_OBJECT_NOT_ALLOWED.on(classObject)); break; + case OK: + // Everything is OK so no errors to trace. + break; } } } + + private void createClassObjectForEnumClass(JetClass klass, MutableClassDescriptor mutableClassDescriptor) { + if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) { + MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor( + mutableClassDescriptor, outerScope, ClassKind.OBJECT, "class-object-for-" + klass.getName()); + classObjectDescriptor.setModality(Modality.FINAL); + classObjectDescriptor.setVisibility(DescriptorResolver.resolveVisibilityFromModifiers(klass.getModifierList())); + classObjectDescriptor.setTypeParameterDescriptors(new ArrayList(0)); + classObjectDescriptor.createTypeConstructor(); + createPrimaryConstructorForObject(null, classObjectDescriptor); + mutableClassDescriptor.getBuilder().setClassObjectDescriptor(classObjectDescriptor); + } + } + + private MutableClassDescriptor createClassDescriptorForObject( + @NotNull JetObjectDeclaration declaration, @NotNull NamespaceLikeBuilder owner, JetScope scope) { + MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor( + owner.getOwnerForChildren(), scope, ClassKind.OBJECT, JetPsiUtil.safeName(declaration.getName())); + context.getObjects().put(declaration, mutableClassDescriptor); + + JetScope classScope = mutableClassDescriptor.getScopeForMemberResolution(); + + prepareForDeferredCall(classScope, mutableClassDescriptor, declaration); + + createPrimaryConstructorForObject(declaration, mutableClassDescriptor); + owner.addObjectDescriptor(mutableClassDescriptor); + trace.record(BindingContext.CLASS, declaration, mutableClassDescriptor); + return mutableClassDescriptor; + } + + private MutableClassDescriptor createClassDescriptorForEnumEntry(@NotNull JetEnumEntry declaration, @NotNull NamespaceLikeBuilder owner) { + MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor( + owner.getOwnerForChildren(), getStaticScope(declaration, owner), ClassKind.ENUM_ENTRY, JetPsiUtil.safeName(declaration.getName())); + context.getClasses().put(declaration, mutableClassDescriptor); + + prepareForDeferredCall(mutableClassDescriptor.getScopeForMemberResolution(), mutableClassDescriptor, declaration); + + // ??? - is enum entry object? + createPrimaryConstructorForObject(declaration, mutableClassDescriptor); + owner.addObjectDescriptor(mutableClassDescriptor); + trace.record(BindingContext.CLASS, declaration, mutableClassDescriptor); + return mutableClassDescriptor; + } + + private void createPrimaryConstructorForObject(@Nullable PsiElement object, MutableClassDescriptor mutableClassDescriptor) { + ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(mutableClassDescriptor, Collections.emptyList(), true); + + // TODO check set mutableClassDescriptor.getVisibility() + constructorDescriptor.initialize(Collections.emptyList(), + Collections.emptyList(), Visibilities.INTERNAL); + + // TODO : make the constructor private? + mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor, trace); + if (object != null) { + trace.record(CONSTRUCTOR, object, constructorDescriptor); + } + } + + private void prepareForDeferredCall(@NotNull JetScope outerScope, + @NotNull WithDeferredResolve withDeferredResolve, + @NotNull JetDeclarationContainer container) { + forDeferredResolve.add(container); + context.normalScope.put(container, outerScope); + context.forDeferredResolver.put(container, withDeferredResolve); + } }); } + + return forDeferredResolve; } + + @NotNull - private ClassKind getClassKind(@NotNull JetClass jetClass) { + private static ClassKind getClassKind(@NotNull JetClass jetClass) { if (jetClass.isTrait()) return ClassKind.TRAIT; if (jetClass.hasModifier(JetTokens.ANNOTATION_KEYWORD)) return ClassKind.ANNOTATION_CLASS; if (jetClass.hasModifier(JetTokens.ENUM_KEYWORD)) return ClassKind.ENUM_CLASS; @@ -258,7 +372,8 @@ public class TypeHierarchyResolver { for (Map.Entry entry : context.getClasses().entrySet()) { JetClass jetClass = entry.getKey(); MutableClassDescriptor descriptor = entry.getValue(); - descriptorResolver.resolveGenericBounds(jetClass, descriptor.getScopeForSupertypeResolution(), descriptor.getTypeConstructor().getParameters(), trace); + descriptorResolver.resolveGenericBounds(jetClass, descriptor.getScopeForSupertypeResolution(), + descriptor.getTypeConstructor().getParameters(), trace); descriptorResolver.resolveSupertypes(jetClass, descriptor, trace); } for (Map.Entry entry : context.getObjects().entrySet()) { @@ -292,7 +407,9 @@ public class TypeHierarchyResolver { } } - private static void topologicallySort(MutableClassDescriptor mutableClassDescriptor, Set visited, LinkedList topologicalOrder) { + private static void topologicallySort(MutableClassDescriptor mutableClassDescriptor, + Set visited, + LinkedList topologicalOrder) { if (!visited.add(mutableClassDescriptor)) { return; } @@ -306,7 +423,10 @@ public class TypeHierarchyResolver { topologicalOrder.addFirst(mutableClassDescriptor); } - private void traverseTypeHierarchy(MutableClassDescriptor currentClass, Set visited, Set beingProcessed, List currentPath) { + private void traverseTypeHierarchy(MutableClassDescriptor currentClass, + Set visited, + Set beingProcessed, + List currentPath) { if (!visited.add(currentClass)) { if (beingProcessed.contains(currentClass)) { markCycleErrors(currentPath, currentClass); @@ -314,7 +434,8 @@ public class TypeHierarchyResolver { ClassDescriptor subclassOfCurrent = currentPath.get(currentPath.size() - 1); assert subclassOfCurrent instanceof MutableClassDescriptor; // Disconnect the loop - for (Iterator iterator = ((MutableClassDescriptor) subclassOfCurrent).getSupertypes().iterator(); iterator.hasNext(); ) { + for (Iterator iterator = ((MutableClassDescriptor) subclassOfCurrent).getSupertypes().iterator(); + iterator.hasNext(); ) { JetType type = iterator.next(); if (type.getConstructor() == currentClass.getTypeConstructor()) { iterator.remove(); @@ -340,11 +461,8 @@ public class TypeHierarchyResolver { private void markCycleErrors(List currentPath, @NotNull ClassDescriptor current) { int size = currentPath.size(); - boolean found = false; - for (int i = 0; i < size; i++) { + for (int i = size - 1; i >= 0; i--) { ClassDescriptor classDescriptor = currentPath.get(i); - if (classDescriptor == current) found = true; - if (!found) continue; ClassDescriptor superclass = (i < size - 1) ? currentPath.get(i + 1) : current; PsiElement psiElement = BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), classDescriptor); @@ -371,6 +489,11 @@ public class TypeHierarchyResolver { if (elementToMark != null) { trace.report(CYCLIC_INHERITANCE_HIERARCHY.on(elementToMark)); } + + if (classDescriptor == current) { + // Beginning of cycle is found + break; + } } } @@ -408,11 +531,14 @@ public class TypeHierarchyResolver { if (conflictingTypes.size() > 1) { DeclarationDescriptor containingDeclaration = typeParameterDescriptor.getContainingDeclaration(); assert containingDeclaration instanceof ClassDescriptor : containingDeclaration; - JetClassOrObject psiElement = (JetClassOrObject) BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), mutableClassDescriptor); + JetClassOrObject psiElement = (JetClassOrObject) BindingContextUtils + .classDescriptorToDeclaration(trace.getBindingContext(), mutableClassDescriptor); JetDelegationSpecifierList delegationSpecifierList = psiElement.getDelegationSpecifierList(); assert delegationSpecifierList != null; -// trace.getErrorHandler().genericError(delegationSpecifierList.getNode(), "Type parameter " + typeParameterDescriptor.getName() + " of " + containingDeclaration.getName() + " has inconsistent values: " + conflictingTypes); - trace.report(INCONSISTENT_TYPE_PARAMETER_VALUES.on(delegationSpecifierList, typeParameterDescriptor, (ClassDescriptor) containingDeclaration, conflictingTypes)); + // trace.getErrorHandler().genericError(delegationSpecifierList.getNode(), "Type parameter " + typeParameterDescriptor.getName() + " of " + containingDeclaration.getName() + " has inconsistent values: " + conflictingTypes); + trace.report(INCONSISTENT_TYPE_PARAMETER_VALUES + .on(delegationSpecifierList, typeParameterDescriptor, (ClassDescriptor) containingDeclaration, + conflictingTypes)); } } } @@ -484,4 +610,4 @@ public class TypeHierarchyResolver { } } } -} +} \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java index 94bcfc1952f..d6c0688e8f8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java @@ -18,23 +18,17 @@ package org.jetbrains.jet.lang.types.lang; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.FqName; +import org.jetbrains.jet.lang.resolve.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.JetTypeImpl; -import org.jetbrains.jet.lang.types.NamespaceType; -import org.jetbrains.jet.lang.types.TypeConstructor; -import org.jetbrains.jet.lang.types.TypeProjection; -import org.jetbrains.jet.lang.types.Variance; +import org.jetbrains.jet.lang.types.*; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -52,13 +46,23 @@ public class JetStandardClasses { public static final ModuleDescriptor FAKE_STANDARD_CLASSES_MODULE = new ModuleDescriptor(""); - private static final NamespaceDescriptorImpl STANDARD_CLASSES_FAKE_ROOT_NS = new NamespaceDescriptorImpl(FAKE_STANDARD_CLASSES_MODULE, Collections.emptyList(), ""); + private static final NamespaceDescriptorImpl STANDARD_CLASSES_FAKE_ROOT_NS = new NamespaceDescriptorImpl( + FAKE_STANDARD_CLASSES_MODULE, Collections.emptyList(), FqNameUnsafe.ROOT_NAME); static { FAKE_STANDARD_CLASSES_MODULE.setRootNs(STANDARD_CLASSES_FAKE_ROOT_NS); + //WritableScopeImpl writableScope = + // new WritableScopeImpl(JetScope.EMPTY, FAKE_STANDARD_CLASSES_MODULE, RedeclarationHandler.DO_NOTHING); + //STANDARD_CLASSES_FAKE_ROOT_NS.initialize(writableScope); + //STANDARD_CLASSES_FAKE_ROOT_NS.getMemberScope().changeLockLevel(WritableScope.LockLevel.BOTH); } - public static NamespaceDescriptorImpl STANDARD_CLASSES_NAMESPACE = new NamespaceDescriptorImpl(STANDARD_CLASSES_FAKE_ROOT_NS, Collections.emptyList(), "jet"); + public static NamespaceDescriptorImpl STANDARD_CLASSES_NAMESPACE = new NamespaceDescriptorImpl( + STANDARD_CLASSES_FAKE_ROOT_NS, Collections.emptyList(), "jet"); + // + //static { + // STANDARD_CLASSES_FAKE_ROOT_NS.getMemberScope().addNamespace(STANDARD_CLASSES_NAMESPACE); + //} public static final FqName STANDARD_CLASSES_FQNAME = DescriptorUtils.getFQName(STANDARD_CLASSES_NAMESPACE).toSafe(); diff --git a/compiler/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java b/compiler/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java index 84f915ee77d..332b2be20a1 100644 --- a/compiler/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java +++ b/compiler/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java @@ -76,7 +76,7 @@ public class JetDefaultModalityModifiersTest extends JetLiteFixture { } private MutableClassDescriptor createClassDescriptor(ClassKind kind, JetClass aClass) { - MutableClassDescriptor classDescriptor = new MutableClassDescriptor(JetTestUtils.DUMMY_TRACE, root, scope, kind); + MutableClassDescriptor classDescriptor = new MutableClassDescriptor(root, scope, kind, aClass.getName()); descriptorResolver.resolveMutableClassDescriptor(aClass, classDescriptor, JetTestUtils.DUMMY_TRACE); return classDescriptor; } From efe2155f28a276a8c868c25a424640c44ba9d3c2 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 11 May 2012 18:58:54 +0400 Subject: [PATCH 18/88] Intermediate major refactorings for lazy resolve --- .../lang/descriptors/WithDeferredResolve.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/descriptors/WithDeferredResolve.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/WithDeferredResolve.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/WithDeferredResolve.java new file mode 100644 index 00000000000..da3177fa2e4 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/WithDeferredResolve.java @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2012 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.descriptors; + +/** + * @author Nikolay Krasko + */ +public interface WithDeferredResolve { + void forceResolve(); + boolean isAlreadyResolved(); +} From 77e7c53ed14f4d3d39c161f4d4dd5038b105c446 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 11 May 2012 19:22:29 +0400 Subject: [PATCH 19/88] everyone loves idea default templates --- .../jet/lang/descriptors/MutableClassDescriptorLite.java | 4 ++-- .../jet/lang/descriptors/NamespaceDescriptorImpl.java | 4 ++-- .../jet/lang/psi/stubs/elements/JetClassElementType.java | 2 +- .../jet/lang/psi/stubs/elements/JetFunctionElementType.java | 4 ++-- .../jetbrains/jet/lang/psi/stubs/impl/PsiJetFileStubImpl.java | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java index 9bb02dd6420..9ebfffaa1a7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java @@ -69,12 +69,12 @@ public class MutableClassDescriptorLite extends MutableDeclarationDescriptor @Override public void forceResolve() { - //To change body of implemented methods use File | Settings | File Templates. + } @Override public boolean isAlreadyResolved() { - return false; //To change body of implemented methods use File | Settings | File Templates. + return false; } private static boolean isStatic(DeclarationDescriptor declarationDescriptor) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java index 9cc6c0360b8..06b3507b8bd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java @@ -105,11 +105,11 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp @Override public void forceResolve() { - //To change body of implemented methods use File | Settings | File Templates. + } @Override public boolean isAlreadyResolved() { - return false; //To change body of implemented methods use File | Settings | File Templates. + return false; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java index f81a71066f9..3037770347d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java @@ -45,7 +45,7 @@ public class JetClassElementType extends JetStubElementType implements PsiJ @Override public PsiClass[] getClasses() { - return new PsiClass[0]; //To change body of implemented methods use File | Settings | File Templates. + return new PsiClass[0]; } } From dcc6392eb47a02edb9bf03c6176370958256f06f Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 11 May 2012 18:58:54 +0400 Subject: [PATCH 20/88] Intermediate major refactorings for lazy resolve - test fix (order changed) --- .../cfg/LocalDeclarations.instructions | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/compiler/testData/cfg/LocalDeclarations.instructions b/compiler/testData/cfg/LocalDeclarations.instructions index 179ed5fe1d7..060b9e31931 100644 --- a/compiler/testData/cfg/LocalDeclarations.instructions +++ b/compiler/testData/cfg/LocalDeclarations.instructions @@ -29,6 +29,26 @@ error: sink: NEXT:[] PREV:[] ===================== +== O == +object O { + val x : Int + { + $x = 1 + } +} +--------------------- +l0: + NEXT:[v(val x : Int)] PREV:[] + v(val x : Int) NEXT:[r(1)] PREV:[] + r(1) NEXT:[w($x)] PREV:[v(val x : Int)] + w($x) NEXT:[] PREV:[r(1)] +l1: + NEXT:[] PREV:[w($x)] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[] +===================== == null == object { val x : Int @@ -56,26 +76,6 @@ error: sink: NEXT:[] PREV:[] ===================== -== O == -object O { - val x : Int - { - $x = 1 - } -} ---------------------- -l0: - NEXT:[v(val x : Int)] PREV:[] - v(val x : Int) NEXT:[r(1)] PREV:[] - r(1) NEXT:[w($x)] PREV:[v(val x : Int)] - w($x) NEXT:[] PREV:[r(1)] -l1: - NEXT:[] PREV:[w($x)] -error: - NEXT:[] PREV:[] -sink: - NEXT:[] PREV:[] -===================== == doSmth == fun doSmth(i: Int) {} --------------------- From 070a3729e5c695febf235b609d8833c02fbef0b0 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 19:19:52 +0400 Subject: [PATCH 21/88] Fixed unnecessary FQ name bug. #KT-1954 fixed --- .../org/jetbrains/jet/lang/psi/JetClass.java | 43 +++++++++++++++++-- .../jet/lang/psi/JetNamespaceHeader.java | 11 +++++ .../jetbrains/jet/parsing/JetParsingTest.java | 2 + 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java index e126c6036a0..38186556f36 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java @@ -17,8 +17,12 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.StubBasedPsiElement; import com.intellij.psi.stubs.IStubElementType; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,6 +31,7 @@ import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub; import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes; import org.jetbrains.jet.lexer.JetTokens; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -41,11 +46,10 @@ public class JetClass extends JetTypeParameterListOwner public JetClass(@NotNull ASTNode node) { super(node); } - // TODO (stubs) -// public JetClass(final PsiJetClassStub stub) { -// this.stub = stub; -// } + // public JetClass(final PsiJetClassStub stub) { + // this.stub = stub; + // } @Override public List getDeclarations() { @@ -163,4 +167,35 @@ public class JetClass extends JetTypeParameterListOwner public void delete() throws IncorrectOperationException { JetPsiUtil.deleteClass(this); } + + @Override + public boolean isEquivalentTo(PsiElement another) { + if (super.isEquivalentTo(another)) { + return true; + } + if (another instanceof JetClass) { + String fq1 = getQualifiedName(); + String fq2 = ((JetClass) another).getQualifiedName(); + return fq1 != null && fq2 != null && fq1.equals(fq2); + } + return true; + } + + @Nullable + private String getQualifiedName() { + List parts = new ArrayList(); + JetClassOrObject current = this; + while (current != null) { + parts.add(current.getName()); + current = PsiTreeUtil.getParentOfType(current, JetClassOrObject.class); + } + PsiFile file = getContainingFile(); + if (!(file instanceof JetFile)) return null; + String fileQualifiedName = ((JetFile) file).getNamespaceHeader().getQualifiedName(); + if (!fileQualifiedName.isEmpty()) { + parts.add(fileQualifiedName); + } + Collections.reverse(parts); + return StringUtil.join(parts, "."); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java index 8aa9295070f..ad4e4d725ea 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java @@ -81,5 +81,16 @@ public class JetNamespaceHeader extends JetReferenceExpression { public boolean isRoot() { return getName().length() == 0; } + + public String getQualifiedName() { + StringBuilder builder = new StringBuilder(); + for (JetSimpleNameExpression e : findChildrenByClass(JetSimpleNameExpression.class)) { + if (builder.length() > 0) { + builder.append("."); + } + builder.append(e.getName()); + } + return builder.toString(); + } } diff --git a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTest.java b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTest.java index f4bad2d5e47..d5c169c97cf 100644 --- a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTest.java +++ b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTest.java @@ -38,6 +38,7 @@ import java.io.File; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; public class JetParsingTest extends ParsingTestCase { static { @@ -88,6 +89,7 @@ public class JetParsingTest extends ParsingTestCase { String methodName = method.getName(); if (!methodName.startsWith("get") && !methodName.startsWith("find") || methodName.equals("getReference") || methodName.equals("getReferences") || methodName.equals("getUseScope")) continue; + if (!Modifier.isPublic(method.getModifiers())) continue; if (method.getParameterTypes().length > 0) continue; Class declaringClass = method.getDeclaringClass(); if (!declaringClass.getName().startsWith("org.jetbrains.jet")) continue; From 647a5455e1895e1fd9b738e3ae005db5cd82efef Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 8 May 2012 04:05:10 +0400 Subject: [PATCH 22/88] Source representations for Any and Nothing. These sources are to be shown in the IDE --- compiler/frontend/src/jet/Any.jet.src | 3 +++ compiler/frontend/src/jet/Nothing.jet.src | 6 ++++++ 2 files changed, 9 insertions(+) create mode 100644 compiler/frontend/src/jet/Any.jet.src create mode 100644 compiler/frontend/src/jet/Nothing.jet.src diff --git a/compiler/frontend/src/jet/Any.jet.src b/compiler/frontend/src/jet/Any.jet.src new file mode 100644 index 00000000000..636c32f49c1 --- /dev/null +++ b/compiler/frontend/src/jet/Any.jet.src @@ -0,0 +1,3 @@ +package jet + +public open class Any() {} diff --git a/compiler/frontend/src/jet/Nothing.jet.src b/compiler/frontend/src/jet/Nothing.jet.src new file mode 100644 index 00000000000..836cc3bfad7 --- /dev/null +++ b/compiler/frontend/src/jet/Nothing.jet.src @@ -0,0 +1,6 @@ +package jet + +/** + * Nothing has no instances + */ +public class Nothing private () {} From b6bcce2c8ae4e5a2531d8d18fbd8be362518e724 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 8 May 2012 23:26:10 +0400 Subject: [PATCH 23/88] Fixed visibilities, added "val" and package line in TuplesAndFunctionsGenerator. --- .../TuplesAndFunctionsGenerator.java | 10 ++-- .../src/jet/ExtensionFunctions.jet.src | 48 ++++++++++--------- compiler/frontend/src/jet/Functions.jet.src | 48 ++++++++++--------- compiler/frontend/src/jet/Tuples.jet.src | 48 ++++++++++--------- 4 files changed, 81 insertions(+), 73 deletions(-) diff --git a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java index f450390b0e5..51006fccf44 100644 --- a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java +++ b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java @@ -26,9 +26,9 @@ public class TuplesAndFunctionsGenerator { private static void generateTuples(PrintStream out, int count) { generated(out); - out.println("class Tuple0() {}"); + out.println("public class Tuple0() {}"); for (int i = 1; i < count; i++) { - out.print("class Tuple" + i); + out.print("public class Tuple" + i); out.print("<"); for (int j = 1; j <= i; j++) { out.print("out T" + j); @@ -39,7 +39,7 @@ public class TuplesAndFunctionsGenerator { out.print(">"); out.print("("); for (int j = 1; j <= i; j++) { - out.print("_" + j + ": " + "T" + j); + out.print("public val _" + j + ": " + "T" + j); if (j < i) { out.print(", "); } @@ -52,7 +52,7 @@ public class TuplesAndFunctionsGenerator { private static void generateFunctions(PrintStream out, int count, boolean extension) { generated(out); for (int i = 0; i < count; i++) { - out.print("trait Function" + i); + out.print("public trait " + (extension ? "ExtensionFunction" : "Function") + i); out.print("<"); if (extension) { out.print("in T"); @@ -82,6 +82,8 @@ public class TuplesAndFunctionsGenerator { out.println("// Generated by " + TuplesAndFunctionsGenerator.class.getCanonicalName()); out.println("// NOTE: this code is not loaded for JetStandardLibrary, but its equivalent is manually created in JetStandardClasses"); out.println(); + out.println("package jet"); + out.println(); } public static void main(String[] args) throws FileNotFoundException { diff --git a/compiler/frontend/src/jet/ExtensionFunctions.jet.src b/compiler/frontend/src/jet/ExtensionFunctions.jet.src index a4c9768d097..0d87ffc725f 100644 --- a/compiler/frontend/src/jet/ExtensionFunctions.jet.src +++ b/compiler/frontend/src/jet/ExtensionFunctions.jet.src @@ -1,72 +1,74 @@ // Generated by TuplesAndFunctionsGenerator // NOTE: this code is not loaded for JetStandardLibrary, but its equivalent is manually created in JetStandardClasses -trait Function0 { +package jet + +public trait ExtensionFunction0 { fun T.invoke() : R } -trait Function1 { +public trait ExtensionFunction1 { fun T.invoke(p1: P1) : R } -trait Function2 { +public trait ExtensionFunction2 { fun T.invoke(p1: P1, p2: P2) : R } -trait Function3 { +public trait ExtensionFunction3 { fun T.invoke(p1: P1, p2: P2, p3: P3) : R } -trait Function4 { +public trait ExtensionFunction4 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R } -trait Function5 { +public trait ExtensionFunction5 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R } -trait Function6 { +public trait ExtensionFunction6 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R } -trait Function7 { +public trait ExtensionFunction7 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R } -trait Function8 { +public trait ExtensionFunction8 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R } -trait Function9 { +public trait ExtensionFunction9 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R } -trait Function10 { +public trait ExtensionFunction10 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R } -trait Function11 { +public trait ExtensionFunction11 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R } -trait Function12 { +public trait ExtensionFunction12 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R } -trait Function13 { +public trait ExtensionFunction13 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R } -trait Function14 { +public trait ExtensionFunction14 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R } -trait Function15 { +public trait ExtensionFunction15 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R } -trait Function16 { +public trait ExtensionFunction16 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R } -trait Function17 { +public trait ExtensionFunction17 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R } -trait Function18 { +public trait ExtensionFunction18 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R } -trait Function19 { +public trait ExtensionFunction19 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R } -trait Function20 { +public trait ExtensionFunction20 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R } -trait Function21 { +public trait ExtensionFunction21 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R } -trait Function22 { +public trait ExtensionFunction22 { fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R } diff --git a/compiler/frontend/src/jet/Functions.jet.src b/compiler/frontend/src/jet/Functions.jet.src index 857603314d5..2d3571b23dc 100644 --- a/compiler/frontend/src/jet/Functions.jet.src +++ b/compiler/frontend/src/jet/Functions.jet.src @@ -1,72 +1,74 @@ // Generated by TuplesAndFunctionsGenerator // NOTE: this code is not loaded for JetStandardLibrary, but its equivalent is manually created in JetStandardClasses -trait Function0 { +package jet + +public trait Function0 { fun invoke() : R } -trait Function1 { +public trait Function1 { fun invoke(p1: P1) : R } -trait Function2 { +public trait Function2 { fun invoke(p1: P1, p2: P2) : R } -trait Function3 { +public trait Function3 { fun invoke(p1: P1, p2: P2, p3: P3) : R } -trait Function4 { +public trait Function4 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R } -trait Function5 { +public trait Function5 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R } -trait Function6 { +public trait Function6 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R } -trait Function7 { +public trait Function7 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R } -trait Function8 { +public trait Function8 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R } -trait Function9 { +public trait Function9 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R } -trait Function10 { +public trait Function10 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R } -trait Function11 { +public trait Function11 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R } -trait Function12 { +public trait Function12 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R } -trait Function13 { +public trait Function13 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R } -trait Function14 { +public trait Function14 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R } -trait Function15 { +public trait Function15 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R } -trait Function16 { +public trait Function16 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R } -trait Function17 { +public trait Function17 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R } -trait Function18 { +public trait Function18 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R } -trait Function19 { +public trait Function19 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R } -trait Function20 { +public trait Function20 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R } -trait Function21 { +public trait Function21 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R } -trait Function22 { +public trait Function22 { fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R } diff --git a/compiler/frontend/src/jet/Tuples.jet.src b/compiler/frontend/src/jet/Tuples.jet.src index e122ecbdeea..ebbecd1e57c 100644 --- a/compiler/frontend/src/jet/Tuples.jet.src +++ b/compiler/frontend/src/jet/Tuples.jet.src @@ -1,26 +1,28 @@ // Generated by TuplesAndFunctionsGenerator // NOTE: this code is not loaded for JetStandardLibrary, but its equivalent is manually created in JetStandardClasses -class Tuple0() {} -class Tuple1(_1: T1) {} -class Tuple2(_1: T1, _2: T2) {} -class Tuple3(_1: T1, _2: T2, _3: T3) {} -class Tuple4(_1: T1, _2: T2, _3: T3, _4: T4) {} -class Tuple5(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5) {} -class Tuple6(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6) {} -class Tuple7(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) {} -class Tuple8(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) {} -class Tuple9(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) {} -class Tuple10(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10) {} -class Tuple11(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11) {} -class Tuple12(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12) {} -class Tuple13(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13) {} -class Tuple14(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14) {} -class Tuple15(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15) {} -class Tuple16(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16) {} -class Tuple17(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17) {} -class Tuple18(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18) {} -class Tuple19(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18, _19: T19) {} -class Tuple20(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18, _19: T19, _20: T20) {} -class Tuple21(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18, _19: T19, _20: T20, _21: T21) {} -class Tuple22(_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18, _19: T19, _20: T20, _21: T21, _22: T22) {} +package jet + +public class Tuple0() {} +public class Tuple1(public val _1: T1) {} +public class Tuple2(public val _1: T1, public val _2: T2) {} +public class Tuple3(public val _1: T1, public val _2: T2, public val _3: T3) {} +public class Tuple4(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4) {} +public class Tuple5(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5) {} +public class Tuple6(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6) {} +public class Tuple7(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7) {} +public class Tuple8(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8) {} +public class Tuple9(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9) {} +public class Tuple10(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10) {} +public class Tuple11(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11) {} +public class Tuple12(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12) {} +public class Tuple13(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13) {} +public class Tuple14(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14) {} +public class Tuple15(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14, public val _15: T15) {} +public class Tuple16(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14, public val _15: T15, public val _16: T16) {} +public class Tuple17(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14, public val _15: T15, public val _16: T16, public val _17: T17) {} +public class Tuple18(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14, public val _15: T15, public val _16: T16, public val _17: T17, public val _18: T18) {} +public class Tuple19(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14, public val _15: T15, public val _16: T16, public val _17: T17, public val _18: T18, public val _19: T19) {} +public class Tuple20(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14, public val _15: T15, public val _16: T16, public val _17: T17, public val _18: T18, public val _19: T19, public val _20: T20) {} +public class Tuple21(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14, public val _15: T15, public val _16: T16, public val _17: T17, public val _18: T18, public val _19: T19, public val _20: T20, public val _21: T21) {} +public class Tuple22(public val _1: T1, public val _2: T2, public val _3: T3, public val _4: T4, public val _5: T5, public val _6: T6, public val _7: T7, public val _8: T8, public val _9: T9, public val _10: T10, public val _11: T11, public val _12: T12, public val _13: T13, public val _14: T14, public val _15: T15, public val _16: T16, public val _17: T17, public val _18: T18, public val _19: T19, public val _20: T20, public val _21: T21, public val _22: T22) {} From 29a9fdde78945772ba85b65acc433232551c59ac Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 9 May 2012 00:43:42 +0400 Subject: [PATCH 24/88] Moved *.jet.src to separate directory and renamed to them to *.jet. Thus, they will be correctly loadable via PSI. --- .../frontend/generator/TuplesAndFunctionsGenerator.java | 8 ++++---- compiler/frontend/src/{jet/Any.jet.src => std/Any.jet} | 0 .../ExtensionFunctions.jet} | 0 .../src/{jet/Functions.jet.src => std/Functions.jet} | 0 .../frontend/src/{jet/Nothing.jet.src => std/Nothing.jet} | 0 .../frontend/src/{jet/Tuples.jet.src => std/Tuples.jet} | 0 6 files changed, 4 insertions(+), 4 deletions(-) rename compiler/frontend/src/{jet/Any.jet.src => std/Any.jet} (100%) rename compiler/frontend/src/{jet/ExtensionFunctions.jet.src => std/ExtensionFunctions.jet} (100%) rename compiler/frontend/src/{jet/Functions.jet.src => std/Functions.jet} (100%) rename compiler/frontend/src/{jet/Nothing.jet.src => std/Nothing.jet} (100%) rename compiler/frontend/src/{jet/Tuples.jet.src => std/Tuples.jet} (100%) diff --git a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java index 51006fccf44..1c58cbd9c44 100644 --- a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java +++ b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java @@ -87,18 +87,18 @@ public class TuplesAndFunctionsGenerator { } public static void main(String[] args) throws FileNotFoundException { - File baseDir = new File("compiler/frontend/src/jet/"); + File baseDir = new File("compiler/frontend/src/std/"); assert baseDir.exists() : "Base dir does not exist: " + baseDir.getAbsolutePath(); - PrintStream tuples = new PrintStream(new File(baseDir, "Tuples.jet.src")); + PrintStream tuples = new PrintStream(new File(baseDir, "Tuples.jet")); generateTuples(tuples, TUPLE_COUNT); tuples.close(); - PrintStream functions = new PrintStream(new File(baseDir, "Functions.jet.src")); + PrintStream functions = new PrintStream(new File(baseDir, "Functions.jet")); generateFunctions(functions, TUPLE_COUNT, false); functions.close(); - PrintStream extensionFunctions = new PrintStream(new File(baseDir, "ExtensionFunctions.jet.src")); + PrintStream extensionFunctions = new PrintStream(new File(baseDir, "ExtensionFunctions.jet")); generateFunctions(extensionFunctions, TUPLE_COUNT, true); extensionFunctions.close(); } diff --git a/compiler/frontend/src/jet/Any.jet.src b/compiler/frontend/src/std/Any.jet similarity index 100% rename from compiler/frontend/src/jet/Any.jet.src rename to compiler/frontend/src/std/Any.jet diff --git a/compiler/frontend/src/jet/ExtensionFunctions.jet.src b/compiler/frontend/src/std/ExtensionFunctions.jet similarity index 100% rename from compiler/frontend/src/jet/ExtensionFunctions.jet.src rename to compiler/frontend/src/std/ExtensionFunctions.jet diff --git a/compiler/frontend/src/jet/Functions.jet.src b/compiler/frontend/src/std/Functions.jet similarity index 100% rename from compiler/frontend/src/jet/Functions.jet.src rename to compiler/frontend/src/std/Functions.jet diff --git a/compiler/frontend/src/jet/Nothing.jet.src b/compiler/frontend/src/std/Nothing.jet similarity index 100% rename from compiler/frontend/src/jet/Nothing.jet.src rename to compiler/frontend/src/std/Nothing.jet diff --git a/compiler/frontend/src/jet/Tuples.jet.src b/compiler/frontend/src/std/Tuples.jet similarity index 100% rename from compiler/frontend/src/jet/Tuples.jet.src rename to compiler/frontend/src/std/Tuples.jet From d6e3a392f6e1f4eaf5f43cffc55fd1d8b0531931 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 9 May 2012 01:08:51 +0400 Subject: [PATCH 25/88] Added navigation to sources of builtin entities. #KT-1069 fixed --- .../jet/lang/resolve/BindingContextUtils.java | 11 -- idea/src/META-INF/plugin.xml | 3 + .../plugin/references/JetPsiReference.java | 7 + .../StandardLibraryReferenceResolver.java | 166 ++++++++++++++++++ 4 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java index 389a3fa1486..938868bd8ee 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java @@ -24,7 +24,6 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.VariableAsFunctionResolvedCall; -import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.util.slicedmap.ReadOnlySlice; import org.jetbrains.jet.util.slicedmap.Slices; @@ -74,11 +73,6 @@ public class BindingContextUtils { return element; } - // TODO: Need to have a valid stubs for standard classes - if (referenceExpression != null && JetStandardClasses.getAllStandardClasses().contains(declarationDescriptor)) { - return referenceExpression.getContainingFile(); - } - return null; } @@ -94,11 +88,6 @@ public class BindingContextUtils { return elements; } - // TODO: Need to have a valid stubs for standard classes - if (referenceExpression != null && JetStandardClasses.getAllStandardClasses().contains(declarationDescriptor)) { - return Lists.newArrayList(referenceExpression.getContainingFile()); - } - return Lists.newArrayList(); } diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index c04ae767ba5..4b3b4ac859a 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -18,6 +18,9 @@ org.jetbrains.jet.plugin.caches.JetCacheManager + + org.jetbrains.jet.plugin.references.StandardLibraryReferenceResolver + diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java index cb64f9cd50c..a4bfbabd7df 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java @@ -110,6 +110,13 @@ public abstract class JetPsiReference implements PsiPolyVariantReference { if (psiElement.size() > 1) { return null; } + if (psiElement.isEmpty()) { + PsiElement stdlibSymbol = myExpression.getProject().getComponent(StandardLibraryReferenceResolver.class) + .resolveStandardLibrarySymbol(bindingContext, myExpression); + if (stdlibSymbol != null) { + return stdlibSymbol; + } + } Collection declarationDescriptors = bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, myExpression); if (declarationDescriptors != null) return null; diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java new file mode 100644 index 00000000000..e751c898592 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -0,0 +1,166 @@ +/* + * Copyright 2010-2012 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.plugin.references; + +import com.intellij.openapi.components.AbstractProjectComponent; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.startup.StartupManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetReferenceExpression; +import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import org.jetbrains.jet.resolve.DescriptorRenderer; + +import java.util.Collections; +import java.util.List; + +public class StandardLibraryReferenceResolver extends AbstractProjectComponent { + @SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized") + private BindingContext bindingContext = null; + + public StandardLibraryReferenceResolver(Project project) { + super(project); + } + + @Override + public void initComponent() { + StartupManager.getInstance(myProject).registerPostStartupActivity(new Runnable() { + @Override + public void run() { + ensureInitialized(); + } + }); + } + + private synchronized void ensureInitialized() { + if (bindingContext != null) { + return; + } + + BindingTraceContext context = new BindingTraceContext(); + NamespaceDescriptorImpl fakeRootNamespace = new NamespaceDescriptorImpl(new ModuleDescriptor(""), + Collections.emptyList(), ""); + NamespaceDescriptorImpl jetNamespace = new NamespaceDescriptorImpl(fakeRootNamespace, + Collections.emptyList(), "jet"); + context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, new FqName("jet"), jetNamespace); + + WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, jetNamespace, RedeclarationHandler.THROW_EXCEPTION) + .setDebugName("Builtin classes scope"); + scope.changeLockLevel(WritableScope.LockLevel.BOTH); + jetNamespace.initialize(scope); + + TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("std")); + + ClassDescriptor tuple0 = context.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, new FqName("jet.Tuple0")); + assert tuple0 != null; + scope = new WritableScopeImpl(scope, jetNamespace, RedeclarationHandler.THROW_EXCEPTION).setDebugName("Builtin classes scope #2"); + scope.changeLockLevel(WritableScope.LockLevel.BOTH); + scope.addClassifierAlias("Unit", tuple0); + jetNamespace.initialize(scope); + + TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet")); + AnalyzingUtils.throwExceptionOnErrors(context.getBindingContext()); + + bindingContext = context.getBindingContext(); + } + + private List getJetFiles(String dir) { + String url = StandardLibraryReferenceResolver.class.getResource("/" + dir + "/").toString(); + if (url.startsWith("jar:file:")) { + url = url.replace("jar:file:", "jar:/"); + } + else if (url.startsWith("file:/")) { + url = url.replace("file:/", "file://"); + } + else { + assert false; + } + + VirtualFile vf = VirtualFileManager.getInstance().findFileByUrl(url); + assert vf != null; + PsiDirectory psiDirectory = PsiManager.getInstance(myProject).findDirectory(vf); + assert psiDirectory != null; + return ContainerUtil.mapNotNull(psiDirectory.getFiles(), new Function() { + @Override + public JetFile fun(PsiFile file) { + return file instanceof JetFile ? (JetFile) file : null; + } + }); + } + + @Nullable + private DeclarationDescriptor findCurrentDescriptor(@NotNull DeclarationDescriptor originalDescriptor) { + if (originalDescriptor instanceof ClassDescriptor) { + return bindingContext.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, DescriptorUtils.getFQName(originalDescriptor).toSafe()); + } + else if (originalDescriptor instanceof NamespaceDescriptor) { + return bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, DescriptorUtils.getFQName(originalDescriptor).toSafe()); + } + else { + DeclarationDescriptor parent = originalDescriptor.getContainingDeclaration(); + if (parent == null) return null; + parent = findCurrentDescriptor(parent); + JetScope memberScope; + if (parent instanceof ClassDescriptor) { + memberScope = ((ClassDescriptor) parent).getDefaultType().getMemberScope(); + } + else if (parent instanceof NamespaceDescriptor) { + memberScope = ((NamespaceDescriptor)parent).getMemberScope(); + } + else { + return null; + } + String renderedOriginal = DescriptorRenderer.TEXT.render(originalDescriptor); + for (DeclarationDescriptor member : memberScope.getAllDescriptors()) { + if (renderedOriginal.equals(DescriptorRenderer.TEXT.render(member))) { + return member; + } + } + } + return null; + } + + @Nullable + public PsiElement resolveStandardLibrarySymbol(@NotNull BindingContext originalContext, @Nullable JetReferenceExpression referenceExpression) { + ensureInitialized(); + DeclarationDescriptor declarationDescriptor = BindingContextUtils.referenceToDescriptor(originalContext, referenceExpression); + + if (declarationDescriptor != null) { + declarationDescriptor = declarationDescriptor.getOriginal(); + declarationDescriptor = findCurrentDescriptor(declarationDescriptor); + if (declarationDescriptor != null) { + return BindingContextUtils.descriptorToDeclaration(bindingContext, declarationDescriptor); + } + } + return null; + } +} From 124266ea68bf33a72bfc82a3614c8b954e37e44a Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 9 May 2012 13:00:02 +0400 Subject: [PATCH 26/88] Fixed highlighter tests. --- idea/testData/highlighter/Functions.kt | 2 +- idea/testData/highlighter/Variables.kt | 8 ++++---- idea/testData/highlighter/VariablesAsFunctions.kt | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/idea/testData/highlighter/Functions.kt b/idea/testData/highlighter/Functions.kt index 26f8a22aeaa..1028ad0fab2 100644 --- a/idea/testData/highlighter/Functions.kt +++ b/idea/testData/highlighter/Functions.kt @@ -5,7 +5,7 @@ fun global() { inner() } -fun Int.ext() { +fun Int.ext() { } open class Container { diff --git a/idea/testData/highlighter/Variables.kt b/idea/testData/highlighter/Variables.kt index a5bb879c89c..5291ac34d3e 100644 --- a/idea/testData/highlighter/Variables.kt +++ b/idea/testData/highlighter/Variables.kt @@ -1,21 +1,21 @@ var x = 5 -val Int.sq : Int +val Int.sq : Int get() { return this * this } -val y : Int = 1 +val y : Int = 1 get() { return 5.sq + $y + x } -class Foo(val a : Int, b : String) { +class Foo(val a : Int, b : String) { { b } - var v : Int + var v : Int get() { return 1; } diff --git a/idea/testData/highlighter/VariablesAsFunctions.kt b/idea/testData/highlighter/VariablesAsFunctions.kt index 8f097a03643..356c031cdab 100644 --- a/idea/testData/highlighter/VariablesAsFunctions.kt +++ b/idea/testData/highlighter/VariablesAsFunctions.kt @@ -1,11 +1,11 @@ -var global : () -> Unit = {} +var global : () -> Unit = {} -val Int.ext : () -> Unit +val Int.ext : () -> Unit get() { return {} } -fun foo(a : () -> Unit) { +fun foo(a : () -> Unit) { a() global() 1.ext() From ebfddd3d7d728d087c71598269be4a822263bf07 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 17:45:44 +0400 Subject: [PATCH 27/88] Replaced self-written hacky conversion of java URLs into IDEA VFS URLs with using VfsUtil. --- .../StandardLibraryReferenceResolver.java | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index e751c898592..5e79fd3198a 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -19,8 +19,8 @@ package org.jetbrains.jet.plugin.references; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -40,6 +40,7 @@ import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.resolve.DescriptorRenderer; +import java.net.URL; import java.util.Collections; import java.util.List; @@ -94,19 +95,10 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { } private List getJetFiles(String dir) { - String url = StandardLibraryReferenceResolver.class.getResource("/" + dir + "/").toString(); - if (url.startsWith("jar:file:")) { - url = url.replace("jar:file:", "jar:/"); - } - else if (url.startsWith("file:/")) { - url = url.replace("file:/", "file://"); - } - else { - assert false; - } - - VirtualFile vf = VirtualFileManager.getInstance().findFileByUrl(url); + URL url = StandardLibraryReferenceResolver.class.getResource("/" + dir + "/"); + VirtualFile vf = VfsUtil.findFileByURL(url); assert vf != null; + PsiDirectory psiDirectory = PsiManager.getInstance(myProject).findDirectory(vf); assert psiDirectory != null; return ContainerUtil.mapNotNull(psiDirectory.getFiles(), new Function() { From 7c96aec630e76c14bb06f19c3de57f2fac7cfec1 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 18:17:48 +0400 Subject: [PATCH 28/88] Renamed "std" library containing Any, Nothing, tuple and function types to "jet.src" and added readme file. --- compiler/frontend/generator/TuplesAndFunctionsGenerator.java | 2 +- compiler/frontend/src/{std => jet.src}/Any.jet | 0 compiler/frontend/src/{std => jet.src}/ExtensionFunctions.jet | 0 compiler/frontend/src/{std => jet.src}/Functions.jet | 0 compiler/frontend/src/{std => jet.src}/Nothing.jet | 0 compiler/frontend/src/jet.src/README.md | 4 ++++ compiler/frontend/src/{std => jet.src}/Tuples.jet | 0 .../plugin/references/StandardLibraryReferenceResolver.java | 2 +- 8 files changed, 6 insertions(+), 2 deletions(-) rename compiler/frontend/src/{std => jet.src}/Any.jet (100%) rename compiler/frontend/src/{std => jet.src}/ExtensionFunctions.jet (100%) rename compiler/frontend/src/{std => jet.src}/Functions.jet (100%) rename compiler/frontend/src/{std => jet.src}/Nothing.jet (100%) create mode 100644 compiler/frontend/src/jet.src/README.md rename compiler/frontend/src/{std => jet.src}/Tuples.jet (100%) diff --git a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java index 1c58cbd9c44..0157768f0f5 100644 --- a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java +++ b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java @@ -87,7 +87,7 @@ public class TuplesAndFunctionsGenerator { } public static void main(String[] args) throws FileNotFoundException { - File baseDir = new File("compiler/frontend/src/std/"); + File baseDir = new File("compiler/frontend/src/jet.src/"); assert baseDir.exists() : "Base dir does not exist: " + baseDir.getAbsolutePath(); PrintStream tuples = new PrintStream(new File(baseDir, "Tuples.jet")); diff --git a/compiler/frontend/src/std/Any.jet b/compiler/frontend/src/jet.src/Any.jet similarity index 100% rename from compiler/frontend/src/std/Any.jet rename to compiler/frontend/src/jet.src/Any.jet diff --git a/compiler/frontend/src/std/ExtensionFunctions.jet b/compiler/frontend/src/jet.src/ExtensionFunctions.jet similarity index 100% rename from compiler/frontend/src/std/ExtensionFunctions.jet rename to compiler/frontend/src/jet.src/ExtensionFunctions.jet diff --git a/compiler/frontend/src/std/Functions.jet b/compiler/frontend/src/jet.src/Functions.jet similarity index 100% rename from compiler/frontend/src/std/Functions.jet rename to compiler/frontend/src/jet.src/Functions.jet diff --git a/compiler/frontend/src/std/Nothing.jet b/compiler/frontend/src/jet.src/Nothing.jet similarity index 100% rename from compiler/frontend/src/std/Nothing.jet rename to compiler/frontend/src/jet.src/Nothing.jet diff --git a/compiler/frontend/src/jet.src/README.md b/compiler/frontend/src/jet.src/README.md new file mode 100644 index 00000000000..2aef103ac7a --- /dev/null +++ b/compiler/frontend/src/jet.src/README.md @@ -0,0 +1,4 @@ +These files are used only for navigation from user code in IDE. + +These files are not processed by Kotlin compiler. Compiler creates Any, Nothing, tuple and function +types on-the-fly. \ No newline at end of file diff --git a/compiler/frontend/src/std/Tuples.jet b/compiler/frontend/src/jet.src/Tuples.jet similarity index 100% rename from compiler/frontend/src/std/Tuples.jet rename to compiler/frontend/src/jet.src/Tuples.jet diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index 5e79fd3198a..1801901aee9 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -79,7 +79,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { scope.changeLockLevel(WritableScope.LockLevel.BOTH); jetNamespace.initialize(scope); - TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("std")); + TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet.src")); ClassDescriptor tuple0 = context.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, new FqName("jet.Tuple0")); assert tuple0 != null; From ec021e05c802b427e32cf7a8eb14139b2118091f Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 20:15:06 +0400 Subject: [PATCH 29/88] Introduced resolveStandardLibrarySymbol() taking DeclarationDescriptor. --- .../StandardLibraryReferenceResolver.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index 1801901aee9..3bdb0eb3d9f 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -146,12 +146,18 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { ensureInitialized(); DeclarationDescriptor declarationDescriptor = BindingContextUtils.referenceToDescriptor(originalContext, referenceExpression); - if (declarationDescriptor != null) { - declarationDescriptor = declarationDescriptor.getOriginal(); - declarationDescriptor = findCurrentDescriptor(declarationDescriptor); - if (declarationDescriptor != null) { - return BindingContextUtils.descriptorToDeclaration(bindingContext, declarationDescriptor); - } + return declarationDescriptor != null ? resolveStandardLibrarySymbol(declarationDescriptor) : null; + } + + @Nullable + public PsiElement resolveStandardLibrarySymbol(@NotNull DeclarationDescriptor declarationDescriptor) { + ensureInitialized(); + DeclarationDescriptor descriptor = declarationDescriptor; + + descriptor = descriptor.getOriginal(); + descriptor = findCurrentDescriptor(descriptor); + if (descriptor != null) { + return BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor); } return null; } From b56874e119bf4fa495b34e96fed2a1e772d65cd7 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 20:16:25 +0400 Subject: [PATCH 30/88] Replaced synchronized method with synchronizing on internal lock object. --- .../StandardLibraryReferenceResolver.java | 62 ++++++++++--------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index 3bdb0eb3d9f..570da1c1692 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -48,6 +48,8 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { @SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized") private BindingContext bindingContext = null; + private final Object lock = new Object(); + public StandardLibraryReferenceResolver(Project project) { super(project); } @@ -62,36 +64,38 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { }); } - private synchronized void ensureInitialized() { - if (bindingContext != null) { - return; + private void ensureInitialized() { + synchronized (lock) { + if (bindingContext != null) { + return; + } + + BindingTraceContext context = new BindingTraceContext(); + NamespaceDescriptorImpl fakeRootNamespace = new NamespaceDescriptorImpl(new ModuleDescriptor(""), + Collections.emptyList(), ""); + NamespaceDescriptorImpl jetNamespace = new NamespaceDescriptorImpl(fakeRootNamespace, + Collections.emptyList(), "jet"); + context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, new FqName("jet"), jetNamespace); + + WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, jetNamespace, RedeclarationHandler.THROW_EXCEPTION) + .setDebugName("Builtin classes scope"); + scope.changeLockLevel(WritableScope.LockLevel.BOTH); + jetNamespace.initialize(scope); + + TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet.src")); + + ClassDescriptor tuple0 = context.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, new FqName("jet.Tuple0")); + assert tuple0 != null; + scope = new WritableScopeImpl(scope, jetNamespace, RedeclarationHandler.THROW_EXCEPTION).setDebugName("Builtin classes scope #2"); + scope.changeLockLevel(WritableScope.LockLevel.BOTH); + scope.addClassifierAlias("Unit", tuple0); + jetNamespace.initialize(scope); + + TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet")); + AnalyzingUtils.throwExceptionOnErrors(context.getBindingContext()); + + bindingContext = context.getBindingContext(); } - - BindingTraceContext context = new BindingTraceContext(); - NamespaceDescriptorImpl fakeRootNamespace = new NamespaceDescriptorImpl(new ModuleDescriptor(""), - Collections.emptyList(), ""); - NamespaceDescriptorImpl jetNamespace = new NamespaceDescriptorImpl(fakeRootNamespace, - Collections.emptyList(), "jet"); - context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, new FqName("jet"), jetNamespace); - - WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, jetNamespace, RedeclarationHandler.THROW_EXCEPTION) - .setDebugName("Builtin classes scope"); - scope.changeLockLevel(WritableScope.LockLevel.BOTH); - jetNamespace.initialize(scope); - - TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet.src")); - - ClassDescriptor tuple0 = context.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, new FqName("jet.Tuple0")); - assert tuple0 != null; - scope = new WritableScopeImpl(scope, jetNamespace, RedeclarationHandler.THROW_EXCEPTION).setDebugName("Builtin classes scope #2"); - scope.changeLockLevel(WritableScope.LockLevel.BOTH); - scope.addClassifierAlias("Unit", tuple0); - jetNamespace.initialize(scope); - - TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet")); - AnalyzingUtils.throwExceptionOnErrors(context.getBindingContext()); - - bindingContext = context.getBindingContext(); } private List getJetFiles(String dir) { From 073a30704f185e2b555d242dda11618c3ae09ffa Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 21:25:41 +0400 Subject: [PATCH 31/88] Made methods of function types public. --- .../TuplesAndFunctionsGenerator.java | 2 +- .../src/jet.src/ExtensionFunctions.jet | 46 +++++++++---------- compiler/frontend/src/jet.src/Functions.jet | 46 +++++++++---------- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java index 0157768f0f5..c650b0092c5 100644 --- a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java +++ b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java @@ -65,7 +65,7 @@ public class TuplesAndFunctionsGenerator { out.print(", "); } out.print("out R> {\n"); - out.print(" fun " + (extension ? "T." : "") + + out.print(" public fun " + (extension ? "T." : "") + "invoke("); for (int j = 1; j <= i; j++) { out.print("p" + j + ": " + "P" + j); diff --git a/compiler/frontend/src/jet.src/ExtensionFunctions.jet b/compiler/frontend/src/jet.src/ExtensionFunctions.jet index 0d87ffc725f..a3d2954fb45 100644 --- a/compiler/frontend/src/jet.src/ExtensionFunctions.jet +++ b/compiler/frontend/src/jet.src/ExtensionFunctions.jet @@ -4,71 +4,71 @@ package jet public trait ExtensionFunction0 { - fun T.invoke() : R + public fun T.invoke() : R } public trait ExtensionFunction1 { - fun T.invoke(p1: P1) : R + public fun T.invoke(p1: P1) : R } public trait ExtensionFunction2 { - fun T.invoke(p1: P1, p2: P2) : R + public fun T.invoke(p1: P1, p2: P2) : R } public trait ExtensionFunction3 { - fun T.invoke(p1: P1, p2: P2, p3: P3) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3) : R } public trait ExtensionFunction4 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R } public trait ExtensionFunction5 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R } public trait ExtensionFunction6 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R } public trait ExtensionFunction7 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R } public trait ExtensionFunction8 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R } public trait ExtensionFunction9 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R } public trait ExtensionFunction10 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R } public trait ExtensionFunction11 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R } public trait ExtensionFunction12 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R } public trait ExtensionFunction13 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R } public trait ExtensionFunction14 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R } public trait ExtensionFunction15 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R } public trait ExtensionFunction16 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R } public trait ExtensionFunction17 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R } public trait ExtensionFunction18 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R } public trait ExtensionFunction19 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R } public trait ExtensionFunction20 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R } public trait ExtensionFunction21 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R } public trait ExtensionFunction22 { - fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R + public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R } diff --git a/compiler/frontend/src/jet.src/Functions.jet b/compiler/frontend/src/jet.src/Functions.jet index 2d3571b23dc..f0e0d901d03 100644 --- a/compiler/frontend/src/jet.src/Functions.jet +++ b/compiler/frontend/src/jet.src/Functions.jet @@ -4,71 +4,71 @@ package jet public trait Function0 { - fun invoke() : R + public fun invoke() : R } public trait Function1 { - fun invoke(p1: P1) : R + public fun invoke(p1: P1) : R } public trait Function2 { - fun invoke(p1: P1, p2: P2) : R + public fun invoke(p1: P1, p2: P2) : R } public trait Function3 { - fun invoke(p1: P1, p2: P2, p3: P3) : R + public fun invoke(p1: P1, p2: P2, p3: P3) : R } public trait Function4 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R } public trait Function5 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R } public trait Function6 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R } public trait Function7 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R } public trait Function8 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R } public trait Function9 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R } public trait Function10 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R } public trait Function11 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R } public trait Function12 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R } public trait Function13 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R } public trait Function14 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R } public trait Function15 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R } public trait Function16 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R } public trait Function17 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R } public trait Function18 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R } public trait Function19 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R } public trait Function20 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R } public trait Function21 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R } public trait Function22 { - fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R + public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R } From 9bbdb4cf568d781e95d74bd7f3df92211731dc04 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Sat, 12 May 2012 17:09:31 +0400 Subject: [PATCH 32/88] KT-1950 Don't complete if after val KT-1894 Do not suggest "trait" after fun #KT-1950 fixed #KT-1894 fixed --- .../JetKeywordCompletionContributor.java | 30 ++++++++++++++----- .../keywords/InFunctionTypeReference.kt | 5 ++++ .../keywords/InPropertyTypeReference.kt | 5 ++++ .../completion/KeywordsCompletionTest.java | 8 +++++ 4 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 idea/testData/completion/keywords/InFunctionTypeReference.kt create mode 100644 idea/testData/completion/keywords/InPropertyTypeReference.kt diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java index 390663cd048..63e98a5058d 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java @@ -28,9 +28,7 @@ import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.filters.*; -import com.intellij.psi.filters.position.FilterPattern; -import com.intellij.psi.filters.position.LeftNeighbour; -import com.intellij.psi.filters.position.PositionElementFilter; +import com.intellij.psi.filters.position.*; import com.intellij.psi.impl.source.tree.LeafPsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; @@ -131,7 +129,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { @Override public boolean isAcceptable(Object element, PsiElement context) { //noinspection unchecked - return PsiTreeUtil.getParentOfType(context, JetFile.class, false, JetClassBody.class, JetBlockExpression.class) != null && + return PsiTreeUtil.getParentOfType(context, JetFile.class, false, JetClassBody.class, JetBlockExpression.class, JetFunction.class) != null && PsiTreeUtil.getParentOfType(context, JetParameterList.class, JetTypeParameterList.class) == null; } @@ -196,16 +194,32 @@ public class JetKeywordCompletionContributor extends CompletionContributor { } } - private static class InPropertyFilter implements ElementFilter { + private static class InPropertyBodyFilter implements ElementFilter { @Override public boolean isAcceptable(Object element, PsiElement context) { - return PsiTreeUtil.getParentOfType(context, JetProperty.class, false) != null; + if (!(element instanceof PsiElement)) return false; + JetProperty property = PsiTreeUtil.getParentOfType(context, JetProperty.class, false); + return property != null && isAfterName(property, (PsiElement) element); } @Override public boolean isClassAcceptable(Class hintClass) { return true; } + + private static boolean isAfterName(@NotNull JetProperty property, @NotNull PsiElement element) { + for (PsiElement child = property.getFirstChild(); child != null; child = child.getNextSibling()) { + if (PsiTreeUtil.isAncestor(child, element, false)) { + break; + } + + if (child.getNode().getElementType() == IDENTIFIER) { + return true; + } + } + + return false; + } } private static class InWhenFilter implements ElementFilter { @@ -284,7 +298,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { TYPE_KEYWORD, VARARG_KEYWORD, WHERE_KEYWORD); - registerScopeKeywordsCompletion(new InPropertyFilter(), + registerScopeKeywordsCompletion(new InPropertyBodyFilter(), ELSE_KEYWORD, FALSE_KEYWORD, NULL_KEYWORD, THIS_KEYWORD, TRUE_KEYWORD); @@ -307,7 +321,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { FUN_TEMPLATE, VAL_SIMPLE_TEMPLATE, VAR_SIMPLE_TEMPLATE, TRAIT_TEMPLATE, CLASS_TEMPLATE, FOR_TEMPLATE, WHEN_TEMPLATE, WHILE_TEMPLATE, DO_WHILE_TEMPLATE, ENUM_CLASS_TEMPLATE); - registerScopeKeywordsCompletion(new InPropertyFilter(), + registerScopeKeywordsCompletion(new InPropertyBodyFilter(), IF_ELSE_ONELINE_TEMPLATE, WHEN_TEMPLATE); registerScopeKeywordsCompletion(new AfterClassInClassBodyFilter(), false, CLASS_OBJECT_WITHOUT_CLASS_TEMPLATE); diff --git a/idea/testData/completion/keywords/InFunctionTypeReference.kt b/idea/testData/completion/keywords/InFunctionTypeReference.kt new file mode 100644 index 00000000000..57495c23492 --- /dev/null +++ b/idea/testData/completion/keywords/InFunctionTypeReference.kt @@ -0,0 +1,5 @@ +fun f. + +// ABSENT: final + +// For KT-1894 \ No newline at end of file diff --git a/idea/testData/completion/keywords/InPropertyTypeReference.kt b/idea/testData/completion/keywords/InPropertyTypeReference.kt new file mode 100644 index 00000000000..64df110d512 --- /dev/null +++ b/idea/testData/completion/keywords/InPropertyTypeReference.kt @@ -0,0 +1,5 @@ +val e. + +// ABSENT: else + +// For KT-1950 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/KeywordsCompletionTest.java b/idea/tests/org/jetbrains/jet/completion/KeywordsCompletionTest.java index 68d3ad8f77f..6e8efd09254 100644 --- a/idea/tests/org/jetbrains/jet/completion/KeywordsCompletionTest.java +++ b/idea/tests/org/jetbrains/jet/completion/KeywordsCompletionTest.java @@ -71,10 +71,18 @@ public class KeywordsCompletionTest extends JetCompletionTestBase { doTest(); } + public void testInFunctionTypeReference() { + doTest(); + } + public void testInParametersList() { doTest(); } + public void testInPropertyTypeReference() { + doTest(); + } + public void testInMethodParametersList() { doTest(); } From ee1d4722fc3251b288643ecfc28c36f328d36508 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sat, 12 May 2012 18:15:38 +0400 Subject: [PATCH 33/88] KT-1970 Bash scripts need to have 755 permission #KT-1970 Fixed --- bin/kotlin | 0 bin/run-test | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/kotlin mode change 100644 => 100755 bin/run-test diff --git a/bin/kotlin b/bin/kotlin old mode 100644 new mode 100755 diff --git a/bin/run-test b/bin/run-test old mode 100644 new mode 100755 From 9265ce4ec9eb0aee8cddafac5345320dce24f257 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 21:36:18 +0400 Subject: [PATCH 34/88] Renumbered type and value parameters of function types. Their numbers now start from 1. This is made for consistency with auto-generated sources for these types. Parameters of runtime types (written in Java) are numbered starting with 0, too. --- .../jetbrains/jet/lang/types/lang/JetStandardClasses.java | 7 +++---- .../diagnostics/tests/override/ExtendFunctionClass.jet | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java index d6c0688e8f8..409fa5a11a9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java @@ -236,11 +236,11 @@ public class JetStandardClasses { private static List createTypeParameters(int parameterCount, ClassDescriptorImpl function) { List parameters = new ArrayList(); - for (int j = 0; j < parameterCount; j++) { + for (int j = 1; j <= parameterCount; j++) { parameters.add(TypeParameterDescriptor.createWithDefaultBound( function, Collections.emptyList(), - true, Variance.IN_VARIANCE, "P" + j, j + 1)); + true, Variance.IN_VARIANCE, "P" + j, j)); } parameters.add(TypeParameterDescriptor.createWithDefaultBound( function, @@ -462,14 +462,13 @@ public class JetStandardClasses { @NotNull public static List getValueParameters(@NotNull FunctionDescriptor functionDescriptor, @NotNull JetType type) { assert isFunctionType(type); - int receiverOffset = getReceiverType(type) != null ? 1 : 0; List valueParameters = Lists.newArrayList(); List parameterTypes = getParameterTypeProjectionsFromFunctionType(type); for (int i = 0; i < parameterTypes.size(); i++) { TypeProjection parameterType = parameterTypes.get(i); ValueParameterDescriptorImpl valueParameterDescriptor = new ValueParameterDescriptorImpl( functionDescriptor, i, Collections.emptyList(), - "p" + (i + receiverOffset), false, parameterType.getType(), false, null); + "p" + (i + 1), false, parameterType.getType(), false, null); valueParameters.add(valueParameterDescriptor); } return valueParameters; diff --git a/compiler/testData/diagnostics/tests/override/ExtendFunctionClass.jet b/compiler/testData/diagnostics/tests/override/ExtendFunctionClass.jet index fe37f3e17f5..6566a78c306 100644 --- a/compiler/testData/diagnostics/tests/override/ExtendFunctionClass.jet +++ b/compiler/testData/diagnostics/tests/override/ExtendFunctionClass.jet @@ -5,5 +5,5 @@ class A : (Int) -> Int { } class B : Function1 { - override fun invoke(p0 : Int) = p0 + override fun invoke(p1 : Int) = p1 } From 240f477fffa208d365290d2c5e58d1019b1ca5d3 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 21:38:14 +0400 Subject: [PATCH 35/88] Introduced FakeJetNamespaceDescriptor, which supports member scope substitution. --- .../StandardLibraryReferenceResolver.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index 570da1c1692..3deec13bd1f 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -71,16 +71,13 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { } BindingTraceContext context = new BindingTraceContext(); - NamespaceDescriptorImpl fakeRootNamespace = new NamespaceDescriptorImpl(new ModuleDescriptor(""), - Collections.emptyList(), ""); - NamespaceDescriptorImpl jetNamespace = new NamespaceDescriptorImpl(fakeRootNamespace, - Collections.emptyList(), "jet"); + FakeJetNamespaceDescriptor jetNamespace = new FakeJetNamespaceDescriptor(); context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, new FqName("jet"), jetNamespace); WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, jetNamespace, RedeclarationHandler.THROW_EXCEPTION) .setDebugName("Builtin classes scope"); scope.changeLockLevel(WritableScope.LockLevel.BOTH); - jetNamespace.initialize(scope); + jetNamespace.setMemberScope(scope); TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet.src")); @@ -89,7 +86,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { scope = new WritableScopeImpl(scope, jetNamespace, RedeclarationHandler.THROW_EXCEPTION).setDebugName("Builtin classes scope #2"); scope.changeLockLevel(WritableScope.LockLevel.BOTH); scope.addClassifierAlias("Unit", tuple0); - jetNamespace.initialize(scope); + jetNamespace.setMemberScope(scope); TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet")); AnalyzingUtils.throwExceptionOnErrors(context.getBindingContext()); @@ -165,4 +162,24 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { } return null; } + + private static class FakeJetNamespaceDescriptor extends NamespaceDescriptorImpl { + private WritableScope memberScope; + + private FakeJetNamespaceDescriptor() { + super(new NamespaceDescriptorImpl(new ModuleDescriptor(""), + Collections.emptyList(), + ""), Collections.emptyList(), "jet"); + } + + void setMemberScope(WritableScope memberScope) { + this.memberScope = memberScope; + } + + @NotNull + @Override + public WritableScope getMemberScope() { + return memberScope; + } + } } From 174ce17033bea8e588f3bc7e6755ac2ee5df2157 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 21:41:07 +0400 Subject: [PATCH 36/88] Replaced jet.Tuple0 with Unit in rendered descriptors. DescriptorRenderer cannot detect fake Tuple0 as Unit. --- .../jet/plugin/references/StandardLibraryReferenceResolver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index 3deec13bd1f..0ee471b2940 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -134,7 +134,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { } String renderedOriginal = DescriptorRenderer.TEXT.render(originalDescriptor); for (DeclarationDescriptor member : memberScope.getAllDescriptors()) { - if (renderedOriginal.equals(DescriptorRenderer.TEXT.render(member))) { + if (renderedOriginal.equals(DescriptorRenderer.TEXT.render(member).replace("jet.Tuple0", "Unit"))) { return member; } } From a7f3e12aec990c838835200387498801d1fdc138 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 21:41:54 +0400 Subject: [PATCH 37/88] Added test checking that StandardLibraryReferenceResolver returns not null for all members of jet namespace. --- .../StandardLibraryReferenceResolverTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java diff --git a/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java b/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java new file mode 100644 index 00000000000..c5fb704168c --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010-2012 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.plugin.references; + +import com.intellij.testFramework.LightCodeInsightTestCase; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.types.lang.JetStandardClasses; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * @author Evgeny Gerashchenko + * @since 5/11/12 + */ +public class StandardLibraryReferenceResolverTest extends LightCodeInsightTestCase { + public void testAllReferencesResolved() { + StandardLibraryReferenceResolver referenceResolver = getProject().getComponent(StandardLibraryReferenceResolver.class); + for (DeclarationDescriptor descriptor : getAllStandardDescriptors(JetStandardClasses.STANDARD_CLASSES_NAMESPACE)) { + if (descriptor instanceof NamespaceDescriptor && "jet".equals(descriptor.getName())) continue; + assertNotNull("Can't resolve " + descriptor, referenceResolver.resolveStandardLibrarySymbol(descriptor)); + } + } + + private static Collection getAllStandardDescriptors(DeclarationDescriptor baseDescriptor) { + final ArrayList descriptors = new ArrayList(); + baseDescriptor.acceptVoid(new DeclarationDescriptorVisitor() { + private Void visitDescriptors(Collection descriptors) { + for (DeclarationDescriptor descriptor : descriptors) { + descriptor.acceptVoid(this); + } + return null; + } + + @Override + public Void visitClassDescriptor(ClassDescriptor descriptor, Void data) { + descriptors.add(descriptor); + return visitDescriptors(descriptor.getDefaultType().getMemberScope().getAllDescriptors()); + } + + @Override + public Void visitNamespaceDescriptor(NamespaceDescriptor descriptor, Void data) { + descriptors.add(descriptor); + return visitDescriptors(descriptor.getMemberScope().getAllDescriptors()); + } + + @Override + public Void visitDeclarationDescriptor(DeclarationDescriptor descriptor, Void data) { + descriptors.add(descriptor); + return null; + } + }); + return descriptors; + } +} From cfb0844706b9647b50837012802c40a3b03fa8af Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Sat, 12 May 2012 19:21:17 +0400 Subject: [PATCH 38/88] Added test microframework and simple test for checking resolving of references to standard library. --- idea/testData/resolve/std/unit.kt | 2 + .../StandardLibraryReferenceResolverTest.java | 38 ++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 idea/testData/resolve/std/unit.kt diff --git a/idea/testData/resolve/std/unit.kt b/idea/testData/resolve/std/unit.kt new file mode 100644 index 00000000000..9e42d93b7ba --- /dev/null +++ b/idea/testData/resolve/std/unit.kt @@ -0,0 +1,2 @@ +var x : Unit? +//jet.src/Tuples.jet:Tuple0 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java b/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java index c5fb704168c..6c539bebd6d 100644 --- a/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java @@ -16,21 +16,30 @@ package org.jetbrains.jet.plugin.references; -import com.intellij.testFramework.LightCodeInsightTestCase; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.tree.PsiCommentImpl; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.testFramework.ResolveTestCase; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; +import org.jetbrains.jet.plugin.PluginTestCaseBase; import java.util.ArrayList; import java.util.Collection; +import java.util.List; /** * @author Evgeny Gerashchenko * @since 5/11/12 */ -public class StandardLibraryReferenceResolverTest extends LightCodeInsightTestCase { +public class StandardLibraryReferenceResolverTest extends ResolveTestCase { + public void testUnit() throws Exception { + doTest(); + } + public void testAllReferencesResolved() { StandardLibraryReferenceResolver referenceResolver = getProject().getComponent(StandardLibraryReferenceResolver.class); for (DeclarationDescriptor descriptor : getAllStandardDescriptors(JetStandardClasses.STANDARD_CLASSES_NAMESPACE)) { @@ -69,4 +78,29 @@ public class StandardLibraryReferenceResolverTest extends LightCodeInsightTestCa }); return descriptors; } + + private void doTest() throws Exception { + JetPsiReference reference = (JetPsiReference) configureByFile(getTestName(true) + ".kt"); + PsiElement resolved = reference.resolve(); + assertNotNull(resolved); + assertEmpty(reference.multiResolve(false)); + + List comments = PsiTreeUtil.getChildrenOfTypeAsList(getFile(), PsiComment.class); + String[] expectedTarget = comments.get(comments.size() - 1).getText().substring(2).split(":"); + assertEquals(2, expectedTarget.length); + String expectedFile = expectedTarget[0]; + String expectedName = expectedTarget[1]; + + PsiFile targetFile = resolved.getContainingFile(); + PsiDirectory targetDir = targetFile.getParent(); + assertNotNull(targetDir); + assertEquals(expectedFile, targetDir.getName() + "/" + targetFile.getName()); + assertInstanceOf(resolved, PsiNamedElement.class); + assertEquals(expectedName, ((PsiNamedElement) resolved).getName()); + } + + @Override + protected String getTestDataPath() { + return PluginTestCaseBase.getTestDataPathBase() + "/resolve/std/"; + } } From 6f3f1a11f453eb68d69c5abd4275e64c70950752 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Sat, 12 May 2012 21:37:01 +0400 Subject: [PATCH 39/88] Added test cases for StandardLibraryReferenceResolverTest. --- idea/testData/resolve/std/any.kt | 2 ++ idea/testData/resolve/std/function.kt | 4 +++ idea/testData/resolve/std/int.kt | 2 ++ idea/testData/resolve/std/nothing.kt | 2 ++ idea/testData/resolve/std/sure.kt | 2 ++ idea/testData/resolve/std/times.kt | 2 ++ idea/testData/resolve/std/tupleElement.kt | 2 ++ .../StandardLibraryReferenceResolverTest.java | 28 +++++++++++++++++++ 8 files changed, 44 insertions(+) create mode 100644 idea/testData/resolve/std/any.kt create mode 100644 idea/testData/resolve/std/function.kt create mode 100644 idea/testData/resolve/std/int.kt create mode 100644 idea/testData/resolve/std/nothing.kt create mode 100644 idea/testData/resolve/std/sure.kt create mode 100644 idea/testData/resolve/std/times.kt create mode 100644 idea/testData/resolve/std/tupleElement.kt diff --git a/idea/testData/resolve/std/any.kt b/idea/testData/resolve/std/any.kt new file mode 100644 index 00000000000..3ffb22ab63f --- /dev/null +++ b/idea/testData/resolve/std/any.kt @@ -0,0 +1,2 @@ +var x : Any? +//jet.src/Any.jet:Any \ No newline at end of file diff --git a/idea/testData/resolve/std/function.kt b/idea/testData/resolve/std/function.kt new file mode 100644 index 00000000000..ce71f6e13f7 --- /dev/null +++ b/idea/testData/resolve/std/function.kt @@ -0,0 +1,4 @@ +fun f(p : () -> String) { + p.invoke() +} +//jet.src/Functions.jet:invoke \ No newline at end of file diff --git a/idea/testData/resolve/std/int.kt b/idea/testData/resolve/std/int.kt new file mode 100644 index 00000000000..e5e0c81870b --- /dev/null +++ b/idea/testData/resolve/std/int.kt @@ -0,0 +1,2 @@ +val x : Int? +//jet/Numbers.jet:Int \ No newline at end of file diff --git a/idea/testData/resolve/std/nothing.kt b/idea/testData/resolve/std/nothing.kt new file mode 100644 index 00000000000..85036d6d450 --- /dev/null +++ b/idea/testData/resolve/std/nothing.kt @@ -0,0 +1,2 @@ +var x : Nothing +//jet.src/Nothing.jet:Nothing \ No newline at end of file diff --git a/idea/testData/resolve/std/sure.kt b/idea/testData/resolve/std/sure.kt new file mode 100644 index 00000000000..e6f03137c38 --- /dev/null +++ b/idea/testData/resolve/std/sure.kt @@ -0,0 +1,2 @@ +val x = 5.sure() +//jet/Library.jet:sure \ No newline at end of file diff --git a/idea/testData/resolve/std/times.kt b/idea/testData/resolve/std/times.kt new file mode 100644 index 00000000000..88f72ff5c56 --- /dev/null +++ b/idea/testData/resolve/std/times.kt @@ -0,0 +1,2 @@ +val x = 2.0 * 3.0 +//jet/Numbers.jet:times \ No newline at end of file diff --git a/idea/testData/resolve/std/tupleElement.kt b/idea/testData/resolve/std/tupleElement.kt new file mode 100644 index 00000000000..46e9f59593b --- /dev/null +++ b/idea/testData/resolve/std/tupleElement.kt @@ -0,0 +1,2 @@ +var x = #(1, 2)._1 +//jet.src/Tuples.jet:_1 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java b/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java index 6c539bebd6d..cc3d5a1ba21 100644 --- a/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolverTest.java @@ -36,6 +36,34 @@ import java.util.List; * @since 5/11/12 */ public class StandardLibraryReferenceResolverTest extends ResolveTestCase { + public void testAny() throws Exception { + doTest(); + } + + public void testFunction() throws Exception { + doTest(); + } + + public void testInt() throws Exception { + doTest(); + } + + public void testNothing() throws Exception { + doTest(); + } + + public void testSure() throws Exception { + doTest(); + } + + public void testTimes() throws Exception { + doTest(); + } + + public void testTupleElement() throws Exception { + doTest(); + } + public void testUnit() throws Exception { doTest(); } From b0c01739249e9925b311224db31d137e8b63ab8d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Sat, 12 May 2012 21:43:22 +0400 Subject: [PATCH 40/88] Removed test for KT-1666, since navigation to standard libraries is working normally now (instead of navigation to the same source). --- compiler/testData/resolve/regressions/kt1666.jet | 1 - 1 file changed, 1 deletion(-) delete mode 100644 compiler/testData/resolve/regressions/kt1666.jet diff --git a/compiler/testData/resolve/regressions/kt1666.jet b/compiler/testData/resolve/regressions/kt1666.jet deleted file mode 100644 index 031d6cce6e4..00000000000 --- a/compiler/testData/resolve/regressions/kt1666.jet +++ /dev/null @@ -1 +0,0 @@ -~file~var x : `file`String = "" \ No newline at end of file From f061fce9a85e0a87a57e2355f7b64aea3d3a56d1 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 12 May 2012 22:21:09 +0400 Subject: [PATCH 41/88] properly read vararg signature from java code KT-1694 Java vararg override, Why is it intuitive interface? #KT-1694 Fixed --- .../lang/resolve/java/JavaDescriptorResolver.java | 1 + .../diagnostics/tests/j+k/OverrideVararg.jet | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/j+k/OverrideVararg.jet diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 5ac681a0dc6..7c0582be345 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1087,6 +1087,7 @@ public class JavaDescriptorResolver { JetType varargElementType; if (psiType instanceof PsiEllipsisType) { varargElementType = JetStandardLibrary.getInstance().getArrayElementType(TypeUtils.makeNotNullable(outType)); + outType = TypeUtils.makeNotNullable(outType); } else { varargElementType = null; diff --git a/compiler/testData/diagnostics/tests/j+k/OverrideVararg.jet b/compiler/testData/diagnostics/tests/j+k/OverrideVararg.jet new file mode 100644 index 00000000000..e90852f6637 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/OverrideVararg.jet @@ -0,0 +1,12 @@ +// FILE: Aaa.java +// http://youtrack.jetbrains.com/issue/KT-1694 + +public abstract class Aaa { + public abstract void foo(String... args); +} + +// FILE: bbb.kt + +class Bbb() : Aaa() { + override fun foo(vararg args: String?) = #() +} From ae58c1c888cb138c9718951245bfc77cbd95c8a6 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 12 May 2012 22:28:39 +0400 Subject: [PATCH 42/88] better comparison of vararg signatures in Read*BinaryClassTest --- compiler/testData/readJavaBinaryClass/vararg/VarargInt.txt | 2 +- compiler/testData/readJavaBinaryClass/vararg/VarargString.txt | 2 +- .../fun/genericWithTypeVariables/FunParamVaragParam.txt | 2 +- .../readKotlinBinaryClass/fun/nonGeneric/FunVarargInt.txt | 2 +- .../readKotlinBinaryClass/fun/nonGeneric/FunVarargInteger.txt | 2 +- .../jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java | 3 +++ 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/compiler/testData/readJavaBinaryClass/vararg/VarargInt.txt b/compiler/testData/readJavaBinaryClass/vararg/VarargInt.txt index 11a443c40e6..5525c0e14eb 100644 --- a/compiler/testData/readJavaBinaryClass/vararg/VarargInt.txt +++ b/compiler/testData/readJavaBinaryClass/vararg/VarargInt.txt @@ -2,5 +2,5 @@ namespace test open class test.VarargInt : java.lang.Object { final /*constructor*/ fun (): test.VarargInt - open fun vararg(/*0*/ vararg p0: jet.Int): jet.Tuple0 + open fun vararg(/*0*/ vararg p0: jet.Int /*jet.IntArray*/): jet.Tuple0 } diff --git a/compiler/testData/readJavaBinaryClass/vararg/VarargString.txt b/compiler/testData/readJavaBinaryClass/vararg/VarargString.txt index 92fc0f8aefb..aba7afbd75c 100644 --- a/compiler/testData/readJavaBinaryClass/vararg/VarargString.txt +++ b/compiler/testData/readJavaBinaryClass/vararg/VarargString.txt @@ -2,5 +2,5 @@ namespace test open class test.VarargString : java.lang.Object { final /*constructor*/ fun (): test.VarargString - open fun vararg(/*0*/ vararg p0: jet.String?): jet.Tuple0 + open fun vararg(/*0*/ vararg p0: jet.String? /*jet.Array*/): jet.Tuple0 } diff --git a/compiler/testData/readKotlinBinaryClass/fun/genericWithTypeVariables/FunParamVaragParam.txt b/compiler/testData/readKotlinBinaryClass/fun/genericWithTypeVariables/FunParamVaragParam.txt index 1ff6ab73562..5c78758960e 100644 --- a/compiler/testData/readKotlinBinaryClass/fun/genericWithTypeVariables/FunParamVaragParam.txt +++ b/compiler/testData/readKotlinBinaryClass/fun/genericWithTypeVariables/FunParamVaragParam.txt @@ -1,3 +1,3 @@ namespace test -final fun funParamVarargParam(/*0*/ a: jet.Int, /*1*/ vararg b: P): jet.Int +final fun funParamVarargParam(/*0*/ a: jet.Int, /*1*/ vararg b: P /*jet.Array

*/): jet.Int diff --git a/compiler/testData/readKotlinBinaryClass/fun/nonGeneric/FunVarargInt.txt b/compiler/testData/readKotlinBinaryClass/fun/nonGeneric/FunVarargInt.txt index 6742e75d737..42fe439fda6 100644 --- a/compiler/testData/readKotlinBinaryClass/fun/nonGeneric/FunVarargInt.txt +++ b/compiler/testData/readKotlinBinaryClass/fun/nonGeneric/FunVarargInt.txt @@ -1,3 +1,3 @@ namespace test -final fun varargInt(/*0*/ a: jet.Int, /*1*/ vararg b: jet.Int): jet.Int +final fun varargInt(/*0*/ a: jet.Int, /*1*/ vararg b: jet.Int /*jet.IntArray*/): jet.Int diff --git a/compiler/testData/readKotlinBinaryClass/fun/nonGeneric/FunVarargInteger.txt b/compiler/testData/readKotlinBinaryClass/fun/nonGeneric/FunVarargInteger.txt index 7777a8d1b19..03d714cf260 100644 --- a/compiler/testData/readKotlinBinaryClass/fun/nonGeneric/FunVarargInteger.txt +++ b/compiler/testData/readKotlinBinaryClass/fun/nonGeneric/FunVarargInteger.txt @@ -1,3 +1,3 @@ namespace test -final fun varargCharSequence(/*0*/ a: jet.Int, /*1*/ vararg b: java.lang.Integer): jet.Int +final fun varargCharSequence(/*0*/ a: jet.Int, /*1*/ vararg b: java.lang.Integer /*jet.Array*/): jet.Int diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java index 3ee445add52..4cacf76cf53 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/NamespaceComparator.java @@ -301,6 +301,9 @@ class NamespaceComparator { sb.append(": "); if (valueParameter.getVarargElementType() != null) { new TypeSerializer(sb).serialize(valueParameter.getVarargElementType()); + sb.append(" /*"); + new TypeSerializer(sb).serialize(valueParameter.getType()); + sb.append("*/"); } else { new TypeSerializer(sb).serialize(valueParameter.getType()); From 8c8ed3a1eef62d01d197e7ca366d4682393ecfa7 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sun, 13 May 2012 00:53:37 +0400 Subject: [PATCH 43/88] KT-1388 Parse static final fields from java binary classes as non-null #KT-1388 Fixed --- .../resolve/java/JavaDescriptorResolver.java | 4 +++ .../testData/diagnostics/tests/Builders.jet | 4 +-- .../diagnostics/tests/ClassObjects.jet | 4 +-- .../diagnostics/tests/Nullability.jet | 4 +-- .../diagnostics/tests/ResolveToJava.jet | 2 +- .../tests/alt-headers/ArrayListAndMap.jet | 4 +-- .../tests/controlFlowAnalysis/kt1156.jet | 2 +- .../tests/controlFlowAnalysis/kt1219.1301.jet | 2 +- .../kt770.kt351.kt735_StatementType.jet | 2 +- .../tests/extensions/ExtensionFunctions.jet | 2 +- .../tests/extensions/GenericIterator.jet | 2 +- .../tests/nullabilityAndAutoCasts/kt244.jet | 2 +- .../tests/regressions/DoubleDefine.jet | 12 +++---- .../diagnostics/tests/regressions/Jet72.jet | 2 +- .../diagnostics/tests/regressions/kt1550.jet | 6 ++-- .../tests/regressions/kt385.109.441.jet | 4 +-- .../diagnostics/tests/regressions/kt469.jet | 2 +- .../diagnostics/tests/regressions/kt549.jet | 2 +- .../diagnostics/tests/regressions/kt716.jet | 2 +- .../diagnostics/tests/regressions/kt750.jet | 2 +- .../javaDescriptorResolver/staticFinal.java | 4 +++ .../compiler/JavaDescriptorResolverTest.java | 32 ++++++++++++++++--- idea/testData/checker/ClassObjects.jet | 4 +-- idea/testData/checker/ExtensionFunctions.jet | 2 +- idea/testData/checker/Nullability.jet | 6 ++-- idea/testData/checker/ResolveToJava.jet | 2 +- .../checker/regression/DoubleDefine.jet | 12 +++---- idea/testData/checker/regression/Jet72.jet | 2 +- 28 files changed, 80 insertions(+), 50 deletions(-) create mode 100644 compiler/testData/javaDescriptorResolver/staticFinal.java diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 7c0582be345..8a4dab27896 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1368,6 +1368,10 @@ public class JavaDescriptorResolver { if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) { propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false); } + else if (members.getter == null && members.setter == null && members.field.getMember().isFinal() && members.field.getMember().isStatic()) { + // http://youtrack.jetbrains.com/issue/KT-1388 + propertyType = TypeUtils.makeNotNullable(propertyType); + } } JetType receiverType; diff --git a/compiler/testData/diagnostics/tests/Builders.jet b/compiler/testData/diagnostics/tests/Builders.jet index 8e5ad378045..c130650b6af 100644 --- a/compiler/testData/diagnostics/tests/Builders.jet +++ b/compiler/testData/diagnostics/tests/Builders.jet @@ -151,9 +151,9 @@ fun html(init : HTML.() -> Unit) : HTML { fun Map.set(key : K, value : V) = this.put(key, value) fun println(message : Any?) { - System.out?.println(message) + System.out.println(message) } fun print(message : Any?) { - System.out?.print(message) + System.out.print(message) } diff --git a/compiler/testData/diagnostics/tests/ClassObjects.jet b/compiler/testData/diagnostics/tests/ClassObjects.jet index d029a8bafd1..716806c23f3 100644 --- a/compiler/testData/diagnostics/tests/ClassObjects.jet +++ b/compiler/testData/diagnostics/tests/ClassObjects.jet @@ -26,6 +26,6 @@ val d = b.x val s = System // error fun test() { - System.out?.println() - java.lang.System.out?.println() + System.out.println() + java.lang.System.out.println() } diff --git a/compiler/testData/diagnostics/tests/Nullability.jet b/compiler/testData/diagnostics/tests/Nullability.jet index 3a8594058b7..b4a7c8e5786 100644 --- a/compiler/testData/diagnostics/tests/Nullability.jet +++ b/compiler/testData/diagnostics/tests/Nullability.jet @@ -8,8 +8,8 @@ fun test() { a?.plus(1) } - val out : java.io.PrintStream? = null//= System.out - val ins = System.`in` + val out : java.io.PrintStream? = null + val ins : java.io.InputStream? = null out?.println() ins?.read() diff --git a/compiler/testData/diagnostics/tests/ResolveToJava.jet b/compiler/testData/diagnostics/tests/ResolveToJava.jet index a50b677f9fb..243fe24d783 100644 --- a/compiler/testData/diagnostics/tests/ResolveToJava.jet +++ b/compiler/testData/diagnostics/tests/ResolveToJava.jet @@ -35,7 +35,7 @@ fun test(l : java.util.List) { // ... } catch(e: Exception) { - System.out?.println(e.getMessage()) + System.out.println(e.getMessage()) } PrintStream("sdf") diff --git a/compiler/testData/diagnostics/tests/alt-headers/ArrayListAndMap.jet b/compiler/testData/diagnostics/tests/alt-headers/ArrayListAndMap.jet index 726d1cc6c00..c9084864299 100644 --- a/compiler/testData/diagnostics/tests/alt-headers/ArrayListAndMap.jet +++ b/compiler/testData/diagnostics/tests/alt-headers/ArrayListAndMap.jet @@ -22,10 +22,10 @@ fun main(args : Array) { test(al, m) } fun test(a : List, m : Map) { - System.out?.println( + System.out.println( a.get(0) + 1 ) HashMap().get(0) if (m.get("") != null) - System.out?.println(m.get("").sure().plus(1)) + System.out.println(m.get("").sure().plus(1)) } diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1156.jet b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1156.jet index dc2fdabf70e..dc513f6d0fc 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1156.jet +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1156.jet @@ -3,5 +3,5 @@ fun foo(maybe: Int?) { val i : Int = maybe ?: throw RuntimeException("No value") - System.out?.println(i) + System.out.println(i) } diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1219.1301.jet b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1219.1301.jet index d1467b8c469..89b7e3346ca 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1219.1301.jet +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1219.1301.jet @@ -15,7 +15,7 @@ fun foo(){ } bar() - System.out?.println(local) + System.out.println(local) } fun Iterable.foreach(operation: (element: T) -> Unit) { diff --git a/compiler/testData/diagnostics/tests/controlStructures/kt770.kt351.kt735_StatementType.jet b/compiler/testData/diagnostics/tests/controlStructures/kt770.kt351.kt735_StatementType.jet index 568b5658255..2612b5c6dce 100644 --- a/compiler/testData/diagnostics/tests/controlStructures/kt770.kt351.kt735_StatementType.jet +++ b/compiler/testData/diagnostics/tests/controlStructures/kt770.kt351.kt735_StatementType.jet @@ -9,7 +9,7 @@ fun main(args : Array) { 2 -> i = 2 // i is surrounded by a black border else -> j = 2 } - System.out?.println(i) + System.out.println(i) } //KT-351 Distinguish statement and expression positions diff --git a/compiler/testData/diagnostics/tests/extensions/ExtensionFunctions.jet b/compiler/testData/diagnostics/tests/extensions/ExtensionFunctions.jet index adb16268b69..8051f93bbc1 100644 --- a/compiler/testData/diagnostics/tests/extensions/ExtensionFunctions.jet +++ b/compiler/testData/diagnostics/tests/extensions/ExtensionFunctions.jet @@ -57,7 +57,7 @@ import outer.* fun main(args: Array) { - System.out?.print(1) + System.out.print(1) val command = parse("") diff --git a/compiler/testData/diagnostics/tests/extensions/GenericIterator.jet b/compiler/testData/diagnostics/tests/extensions/GenericIterator.jet index e8bbda72080..dc7ad332b38 100644 --- a/compiler/testData/diagnostics/tests/extensions/GenericIterator.jet +++ b/compiler/testData/diagnostics/tests/extensions/GenericIterator.jet @@ -23,6 +23,6 @@ fun T?.iterator() = object { fun main(args : Array) { val i : Int? = 1 for (x in i) { - System.out?.println(x) + System.out.println(x) } } diff --git a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt244.jet b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt244.jet index 64c75a7856e..749aae7b9a0 100644 --- a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt244.jet +++ b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt244.jet @@ -7,7 +7,7 @@ fun f(s: String?) { if (s != null) { s.length //ok var i = s.length //error: Only safe calls are allowed on a nullable receiver - System.out?.println(s.length) //error + System.out.println(s.length) //error } } diff --git a/compiler/testData/diagnostics/tests/regressions/DoubleDefine.jet b/compiler/testData/diagnostics/tests/regressions/DoubleDefine.jet index f0622ea3434..309c3ff7e7a 100644 --- a/compiler/testData/diagnostics/tests/regressions/DoubleDefine.jet +++ b/compiler/testData/diagnostics/tests/regressions/DoubleDefine.jet @@ -39,7 +39,7 @@ fun evaluate(expr: StringBuilder, numbers: ArrayList): Int { } fun main(args: Array) { - System.out?.println("24 game") + System.out.println("24 game") val numbers = ArrayList(4) val rnd = Random(); val prompt = StringBuilder() @@ -49,18 +49,18 @@ fun main(args: Array) { if (i > 0) prompt.append(" "); prompt.append(n) } - System.out?.println("Your numbers: " + prompt) - System.out?.println("Enter your expression:") + System.out.println("Your numbers: " + prompt) + System.out.println("Enter your expression:") val reader = BufferedReader(InputStreamReader(System.`in`)) val expr = StringBuilder(reader.readLine()) try { val result = evaluate(expr, numbers) if (result != 24) - System.out?.println("Sorry, that's " + result) + System.out.println("Sorry, that's " + result) else - System.out?.println("You won!"); + System.out.println("You won!"); } catch(e: Throwable) { - System.out?.println(e.getMessage()) + System.out.println(e.getMessage()) } } diff --git a/compiler/testData/diagnostics/tests/regressions/Jet72.jet b/compiler/testData/diagnostics/tests/regressions/Jet72.jet index ab5eb1be4ee..b85b278971b 100644 --- a/compiler/testData/diagnostics/tests/regressions/Jet72.jet +++ b/compiler/testData/diagnostics/tests/regressions/Jet72.jet @@ -11,7 +11,7 @@ val items: ArrayList = ArrayList fun test(room : Object) { for(val item: Item? in items) { if (item?.room === room) { - System.out?.println("You see " + item?.name) + System.out.println("You see " + item?.name) } } } diff --git a/compiler/testData/diagnostics/tests/regressions/kt1550.jet b/compiler/testData/diagnostics/tests/regressions/kt1550.jet index 37c57f034ba..1d8c9923e63 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt1550.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt1550.jet @@ -6,7 +6,7 @@ fun main(args : Array) { val c = ArrayList() c.add(3) - System.out?.println(++(c[0])) - System.out?.println((c[1])--) - System.out?.println(-(c[2])) + System.out.println(++(c[0])) + System.out.println((c[1])--) + System.out.println(-(c[2])) } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/kt385.109.441.jet b/compiler/testData/diagnostics/tests/regressions/kt385.109.441.jet index c45a50035eb..5015dfe9aa0 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt385.109.441.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt385.109.441.jet @@ -25,8 +25,8 @@ fun generic_invoker(gen : () -> T) : T { return gen() } -fun println(message : Int) { System.out?.println(message) } -fun println(message : Long) { System.out?.println(message) } +fun println(message : Int) { System.out.println(message) } +fun println(message : Long) { System.out.println(message) } inline fun run(body : () -> T) : T = body() fun main(args : Array) { diff --git a/compiler/testData/diagnostics/tests/regressions/kt469.jet b/compiler/testData/diagnostics/tests/regressions/kt469.jet index d2000b139e8..e386ab4e9b8 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt469.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt469.jet @@ -8,7 +8,7 @@ fun bar(list : List) { for (i in 1..10) { list += i // error } - System.out?.println(list) + System.out.println(list) } fun List.plusAssign(t : T) { diff --git a/compiler/testData/diagnostics/tests/regressions/kt549.jet b/compiler/testData/diagnostics/tests/regressions/kt549.jet index c4b5b824d90..28050cccb2b 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt549.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt549.jet @@ -12,6 +12,6 @@ package demo fun main(args : Array) { for (a in filter(args, {it.length > 1})) { - System.out?.println("Hello, ${a}!") + System.out.println("Hello, ${a}!") } } diff --git a/compiler/testData/diagnostics/tests/regressions/kt716.jet b/compiler/testData/diagnostics/tests/regressions/kt716.jet index 25fd89edeb6..ec22510913f 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt716.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt716.jet @@ -12,5 +12,5 @@ fun TypeInfo.getJavaClass() : java.lang.Class { fun getJavaClass() = typeinfo.getJavaClass() fun main(args : Array) { - System.out?.println(getJavaClass) + System.out.println(getJavaClass) } diff --git a/compiler/testData/diagnostics/tests/regressions/kt750.jet b/compiler/testData/diagnostics/tests/regressions/kt750.jet index 99427e88195..dbbf53c08bb 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt750.jet +++ b/compiler/testData/diagnostics/tests/regressions/kt750.jet @@ -4,5 +4,5 @@ fun main(args : Array) { var s : Int? = Integer.valueOf(100) val o = i .sure() + s.sure() - System.out?.println(o) + System.out.println(o) } diff --git a/compiler/testData/javaDescriptorResolver/staticFinal.java b/compiler/testData/javaDescriptorResolver/staticFinal.java new file mode 100644 index 00000000000..0d2e17c225b --- /dev/null +++ b/compiler/testData/javaDescriptorResolver/staticFinal.java @@ -0,0 +1,4 @@ + +class StaticFinal { + public static final String foo = "aaa"; +} diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/JavaDescriptorResolverTest.java b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/JavaDescriptorResolverTest.java index abe34ad4639..dbd90b02473 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/JavaDescriptorResolverTest.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/JavaDescriptorResolverTest.java @@ -20,14 +20,19 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.di.InjectorForJavaSemanticServices; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; +import org.jetbrains.jet.lang.types.TypeProjection; import org.junit.Assert; import java.io.File; import java.io.IOException; +import java.util.Collections; +import java.util.Set; /** * @author Stepan Koltsov @@ -40,16 +45,33 @@ public class JavaDescriptorResolverTest extends TestCaseWithTmpdir { compileFileResolveDescriptor("inner.java", new FqName("A")); } - private void compileFileResolveDescriptor(@NotNull String fileRelativePath, @NotNull FqName fqName) throws IOException { + // We cannot declare class and namespace with same name in Kotlin + // http://youtrack.jetbrains.com/issue/KT-1388 + public void testStaticFinal() throws Exception { + JavaDescriptorResolver javaDescriptorResolver = compileFileGetJavaDescriptorResolver("staticFinal.java"); + NamespaceDescriptor ns = javaDescriptorResolver.resolveNamespace(new FqName("StaticFinal"), DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN); + Set foos = ns.getMemberScope().getProperties("foo"); + Assert.assertEquals(1, foos.size()); + VariableDescriptor foo = foos.iterator().next(); + Assert.assertFalse(foo.getType().isNullable()); + } + + private ClassDescriptor compileFileResolveDescriptor(@NotNull String fileRelativePath, @NotNull FqName fqName) throws IOException { + JavaDescriptorResolver javaDescriptorResolver = compileFileGetJavaDescriptorResolver(fileRelativePath); + ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(fqName, DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN); + Assert.assertNotNull(classDescriptor); + return classDescriptor; + } + + private JavaDescriptorResolver compileFileGetJavaDescriptorResolver(String fileRelativePath) throws IOException { JetTestUtils.compileJavaFile(new File("compiler/testData/javaDescriptorResolver/" + fileRelativePath), tmpdir); - JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS); + JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations( + myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS); jetCoreEnvironment.addToClasspath(tmpdir); InjectorForJavaSemanticServices injector = new InjectorForJavaSemanticServices( jetCoreEnvironment.getCompilerDependencies(), jetCoreEnvironment.getProject()); - JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); - ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(fqName, DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN); - Assert.assertNotNull(classDescriptor); + return injector.getJavaDescriptorResolver(); } } diff --git a/idea/testData/checker/ClassObjects.jet b/idea/testData/checker/ClassObjects.jet index 08858238508..cc43a7556ae 100644 --- a/idea/testData/checker/ClassObjects.jet +++ b/idea/testData/checker/ClassObjects.jet @@ -25,6 +25,6 @@ val d = b.x val s = System // error fun test() { - System.out?.println() - java.lang.System.out?.println() + System.out.println() + java.lang.System.out.println() } \ No newline at end of file diff --git a/idea/testData/checker/ExtensionFunctions.jet b/idea/testData/checker/ExtensionFunctions.jet index 934636e0b6d..7548d4db054 100644 --- a/idea/testData/checker/ExtensionFunctions.jet +++ b/idea/testData/checker/ExtensionFunctions.jet @@ -52,7 +52,7 @@ fun Int.foo() = this fun main(args: Array) { - System.out?.print(1) + System.out.print(1) val command = parse("") diff --git a/idea/testData/checker/Nullability.jet b/idea/testData/checker/Nullability.jet index 8f2eaa9e6c7..51250eb9b6b 100644 --- a/idea/testData/checker/Nullability.jet +++ b/idea/testData/checker/Nullability.jet @@ -7,8 +7,8 @@ fun test() { a?.plus(1) } - val out : java.io.PrintStream? = null//= System.out - val ins = System.`in` + val out : java.io.PrintStream? = null + val ins : java.io.InputStream? = null out?.println() ins?.read() @@ -277,4 +277,4 @@ fun f9(a : Int?) : Int { if (a != null) return a return 1 -} \ No newline at end of file +} diff --git a/idea/testData/checker/ResolveToJava.jet b/idea/testData/checker/ResolveToJava.jet index 25910cc8caa..718c029c7df 100644 --- a/idea/testData/checker/ResolveToJava.jet +++ b/idea/testData/checker/ResolveToJava.jet @@ -33,7 +33,7 @@ fun test(l : java.util.List) { // ... } catch(e: Exception) { - System.out?.println(e.getMessage()) + System.out.println(e.getMessage()) } PrintStream("sdf") diff --git a/idea/testData/checker/regression/DoubleDefine.jet b/idea/testData/checker/regression/DoubleDefine.jet index 7205eb6367f..6dc60faa1b2 100644 --- a/idea/testData/checker/regression/DoubleDefine.jet +++ b/idea/testData/checker/regression/DoubleDefine.jet @@ -38,7 +38,7 @@ fun evaluate(expr: StringBuilder, numbers: ArrayList): Int { } fun main(args: Array) { - System.out?.println("24 game") + System.out.println("24 game") val numbers = ArrayList(4) val rnd = Random(); val prompt = StringBuilder() @@ -48,18 +48,18 @@ fun main(args: Array) { if (i > 0) prompt.append(" "); prompt.append(n) } - System.out?.println("Your numbers: " + prompt) - System.out?.println("Enter your expression:") + System.out.println("Your numbers: " + prompt) + System.out.println("Enter your expression:") val reader = BufferedReader(InputStreamReader(System.`in`)) val expr = StringBuilder(reader.readLine()) try { val result = evaluate(expr, numbers) if (result != 24) - System.out?.println("Sorry, that's " + result) + System.out.println("Sorry, that's " + result) else - System.out?.println("You won!"); + System.out.println("You won!"); } catch(e: Throwable) { - System.out?.println(e.getMessage()) + System.out.println(e.getMessage()) } } diff --git a/idea/testData/checker/regression/Jet72.jet b/idea/testData/checker/regression/Jet72.jet index d3d3272c8e3..d41c4af13db 100644 --- a/idea/testData/checker/regression/Jet72.jet +++ b/idea/testData/checker/regression/Jet72.jet @@ -11,7 +11,7 @@ val items: ArrayList = ArrayList fun test(room : Object) { for(val item: Item in items) { if (item.room === room) { - System.out?.println("You see " + item.name) + System.out.println("You see " + item.name) } } } From cccff99d9ef31905c2d47fbccac01df76592d2c0 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sun, 13 May 2012 03:47:52 +0400 Subject: [PATCH 44/88] fix tests --- compiler/integration-tests/data/antTaskJvm/hello.kt | 2 +- compiler/integration-tests/data/compileAndRunHelloApp/hello.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/integration-tests/data/antTaskJvm/hello.kt b/compiler/integration-tests/data/antTaskJvm/hello.kt index 4c4a4b67c8c..9098e3b590a 100644 --- a/compiler/integration-tests/data/antTaskJvm/hello.kt +++ b/compiler/integration-tests/data/antTaskJvm/hello.kt @@ -1,5 +1,5 @@ package Hello fun main(args : Array) { - System.out?.println("Hello!") + System.out.println("Hello!") } diff --git a/compiler/integration-tests/data/compileAndRunHelloApp/hello.kt b/compiler/integration-tests/data/compileAndRunHelloApp/hello.kt index 4c4a4b67c8c..9098e3b590a 100644 --- a/compiler/integration-tests/data/compileAndRunHelloApp/hello.kt +++ b/compiler/integration-tests/data/compileAndRunHelloApp/hello.kt @@ -1,5 +1,5 @@ package Hello fun main(args : Array) { - System.out?.println("Hello!") + System.out.println("Hello!") } From cf3091adb5488b6f17ae80bbcaefed7e47697132 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sun, 13 May 2012 12:49:25 +0400 Subject: [PATCH 45/88] Data flow info always taken into account in safeGetType() The dangerous method removed --- .../jetbrains/jet/lang/resolve/calls/CallResolver.java | 2 +- .../expressions/BasicExpressionTypingVisitor.java | 2 +- .../types/expressions/ExpressionTypingServices.java | 5 ----- .../expressions/PatternMatchingTypingVisitor.java | 4 +++- .../diagnostics/tests/dataFlow/CalleeExpression.jet | 7 +++++++ .../diagnostics/tests/dataFlow/TupleExpression.jet | 7 +++++++ .../diagnostics/tests/dataFlow/WhenSubject.jet | 10 ++++++++++ .../org/jetbrains/jet/types/JetTypeCheckerTest.java | 3 ++- 8 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataFlow/CalleeExpression.jet create mode 100644 compiler/testData/diagnostics/tests/dataFlow/TupleExpression.jet create mode 100644 compiler/testData/diagnostics/tests/dataFlow/WhenSubject.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 2ea4695d62e..236b320ec6a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -212,7 +212,7 @@ public class CallResolver { } else if (calleeExpression != null) { // Here we handle the case where the callee expression must be something of type function, e.g. (foo.bar())(1, 2) - JetType calleeType = expressionTypingServices.safeGetType(context.scope, calleeExpression, NO_EXPECTED_TYPE, context.trace); // We are actually expecting a function, but there seems to be no easy way of expressing this + JetType calleeType = expressionTypingServices.safeGetType(context.scope, calleeExpression, NO_EXPECTED_TYPE, context.dataFlowInfo, context.trace); // We are actually expecting a function, but there seems to be no easy way of expressing this if (!JetStandardClasses.isFunctionType(calleeType)) { // checkTypesWithNoCallee(trace, scope, call); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index aecb9c5427e..085b44dca70 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -350,7 +350,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { List entries = expression.getEntries(); List types = new ArrayList(); for (JetExpression entry : entries) { - types.add(context.expressionTypingServices.safeGetType(context.scope, entry, NO_EXPECTED_TYPE, context.trace)); // TODO + types.add(context.expressionTypingServices.safeGetType(context.scope, entry, NO_EXPECTED_TYPE, context.dataFlowInfo, context.trace)); // TODO } if (context.expectedType != NO_EXPECTED_TYPE && JetStandardClasses.isTupleType(context.expectedType)) { List enrichedTypes = checkArgumentTypes(types, entries, context.expectedType.getArguments(), context); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java index 904fb305eb7..9db4806364c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java @@ -107,11 +107,6 @@ public class ExpressionTypingServices { this.typeResolver = typeResolver; } - @NotNull - public JetType safeGetType(@NotNull JetScope scope, @NotNull JetExpression expression, @NotNull JetType expectedType, BindingTrace trace) { - return safeGetType(scope, expression, expectedType, DataFlowInfo.EMPTY, trace); - } - public JetType safeGetType(@NotNull JetScope scope, @NotNull JetExpression expression, @NotNull JetType expectedType, @NotNull DataFlowInfo dataFlowInfo, BindingTrace trace) { JetType type = getType(scope, expression, expectedType, dataFlowInfo, trace); if (type != null) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java index f68e296f64f..ad6dc3ed906 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java @@ -77,7 +77,9 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor { // TODO :change scope according to the bound value in the when header final JetExpression subjectExpression = expression.getSubjectExpression(); - final JetType subjectType = subjectExpression != null ? context.expressionTypingServices.safeGetType(context.scope, subjectExpression, TypeUtils.NO_EXPECTED_TYPE, context.trace) : ErrorUtils.createErrorType("Unknown type"); + final JetType subjectType = subjectExpression != null + ? context.expressionTypingServices.safeGetType(context.scope, subjectExpression, TypeUtils.NO_EXPECTED_TYPE, context.dataFlowInfo, context.trace) + : ErrorUtils.createErrorType("Unknown type"); final DataFlowValue variableDescriptor = subjectExpression != null ? DataFlowValueFactory.INSTANCE.createDataFlowValue(subjectExpression, subjectType, context.trace.getBindingContext()) : DataFlowValue.NULL; // TODO : exhaustive patterns diff --git a/compiler/testData/diagnostics/tests/dataFlow/CalleeExpression.jet b/compiler/testData/diagnostics/tests/dataFlow/CalleeExpression.jet new file mode 100644 index 00000000000..7343419e835 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlow/CalleeExpression.jet @@ -0,0 +1,7 @@ +class C(val f : () -> Unit) + +fun test(e : Any) { + if (e is C) { + (e.f)() + } +} diff --git a/compiler/testData/diagnostics/tests/dataFlow/TupleExpression.jet b/compiler/testData/diagnostics/tests/dataFlow/TupleExpression.jet new file mode 100644 index 00000000000..e1707933b42 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlow/TupleExpression.jet @@ -0,0 +1,7 @@ +class C(val f : Int) + +fun test(e : Any) { + if (e is C) { + #(e.f) + } +} diff --git a/compiler/testData/diagnostics/tests/dataFlow/WhenSubject.jet b/compiler/testData/diagnostics/tests/dataFlow/WhenSubject.jet new file mode 100644 index 00000000000..663e35aeb4a --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlow/WhenSubject.jet @@ -0,0 +1,10 @@ +trait Expr +class BinOp(val operator : String) : Expr + +fun test(e : Expr) { + if (e is BinOp) { + when (e.operator) { + else -> 0 + } + } +} diff --git a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index c6390d9d060..3309b8b442d 100644 --- a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; @@ -557,7 +558,7 @@ public class JetTypeCheckerTest extends JetLiteFixture { private void assertErrorType(String expression) { Project project = getProject(); JetExpression jetExpression = JetPsiFactory.createExpression(project, expression); - JetType type = expressionTypingServices.safeGetType(scopeWithImports, jetExpression, TypeUtils.NO_EXPECTED_TYPE, JetTestUtils.DUMMY_TRACE); + JetType type = expressionTypingServices.safeGetType(scopeWithImports, jetExpression, TypeUtils.NO_EXPECTED_TYPE, DataFlowInfo.EMPTY, JetTestUtils.DUMMY_TRACE); assertTrue("Error type expected but " + type + " returned", ErrorUtils.isErrorType(type)); } From 1b516d278654e10af6f812ead3bc71c125d6dd1b Mon Sep 17 00:00:00 2001 From: pTalanov Date: Mon, 14 May 2012 18:00:39 +0400 Subject: [PATCH 46/88] Issue related to KT-1962 --- .../k2js/test/semantics/ClosureTest.java | 5 ++++ .../utils/closure/CaptureClosureVisitor.java | 8 ++++++ .../utils/closure/ClosureContext.java | 7 +++-- .../closure/cases/iteratingCallbacks.kt | 4 --- .../closure/cases/localParameterInCallBack.kt | 27 +++++++++++++++++++ 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 js/js.translator/testFiles/closure/cases/localParameterInCallBack.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClosureTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClosureTest.java index e3380fc94c4..e339c280616 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClosureTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClosureTest.java @@ -30,4 +30,9 @@ public final class ClosureTest extends SingleFileTranslationTest { public void testIteratingCallbacks() throws Exception { fooBoxTest(); } + + + public void testLocalParameterInCallback() throws Exception { + fooBoxTest(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/CaptureClosureVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/CaptureClosureVisitor.java index e018b57297a..021417724f8 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/CaptureClosureVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/CaptureClosureVisitor.java @@ -21,8 +21,10 @@ import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetNodeTypes; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.psi.JetElement; +import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.psi.JetTreeVisitor; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -48,6 +50,7 @@ public class CaptureClosureVisitor extends JetTreeVisitor { @Override public Void visitSimpleNameExpression(@NotNull JetSimpleNameExpression expression, @NotNull ClosureContext context) { + //TODO: this gets as dirty as it can be, should clean up and test more or use different approach expression.acceptChildren(this, context); DeclarationDescriptor descriptor = BindingUtils.getNullableDescriptorForReferenceExpression(bindingContext, expression); if (!(descriptor instanceof VariableDescriptor)) { @@ -61,6 +64,11 @@ public class CaptureClosureVisitor extends JetTreeVisitor { if (PsiTreeUtil.isAncestor(functionElement, variableDeclaration, false)) { return null; } + boolean isProperty = variableDescriptor instanceof PropertyDescriptor; + if (!isProperty && !variableDescriptor.isVar() && variableDeclaration instanceof JetProperty) { + context.put(variableDescriptor); + return null; + } boolean isLoopParameter = variableDeclaration.getNode().getElementType().equals(JetNodeTypes.LOOP_PARAMETER); if (isLoopParameter) { context.put(variableDescriptor); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/ClosureContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/ClosureContext.java index e2fec87d2d9..f6761904b17 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/ClosureContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/ClosureContext.java @@ -17,10 +17,13 @@ package org.jetbrains.k2js.translate.utils.closure; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; +import java.util.Collection; import java.util.List; +import java.util.Set; /** * @author Pavel Talanov @@ -28,14 +31,14 @@ import java.util.List; public final class ClosureContext { @NotNull - private List descriptors = Lists.newArrayList(); + private Set descriptors = Sets.newHashSet(); /*package*/ void put(@NotNull VariableDescriptor descriptor) { descriptors.add(descriptor); } @NotNull - public List getDescriptors() { + public Collection getDescriptors() { return descriptors; } } diff --git a/js/js.translator/testFiles/closure/cases/iteratingCallbacks.kt b/js/js.translator/testFiles/closure/cases/iteratingCallbacks.kt index 5928ac14768..a01dd483b94 100644 --- a/js/js.translator/testFiles/closure/cases/iteratingCallbacks.kt +++ b/js/js.translator/testFiles/closure/cases/iteratingCallbacks.kt @@ -24,7 +24,3 @@ fun box() : Boolean { } return (sum == 27) } - -fun main(args : Array) { - println(box()) -} diff --git a/js/js.translator/testFiles/closure/cases/localParameterInCallBack.kt b/js/js.translator/testFiles/closure/cases/localParameterInCallBack.kt new file mode 100644 index 00000000000..4a7e66a3c31 --- /dev/null +++ b/js/js.translator/testFiles/closure/cases/localParameterInCallBack.kt @@ -0,0 +1,27 @@ +package foo + +import java.util.* + +fun box() : Boolean { + val oneTwo = Array(2) { + it + 1 + } + val a = ArrayList<()->Int>() + for (i in oneTwo) { + for (l in 1..2) { + val j = l + a.add({ + var res = 0 + for (t in 0..2) { + res += i * j + } + res + }) + } + } + var sum = 0 + for (f in a) { + sum += f() + } + return (sum == 27) +} From 151b3be99e12e799f4bd9a4d2a10310c954644f5 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 15 May 2012 12:30:28 +0400 Subject: [PATCH 47/88] Got rid of hardcoded "jet" and "jet.Tuple0" constants in StandardLibraryReferenceResolver. --- .../StandardLibraryReferenceResolver.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index 0ee471b2940..1c783de0caf 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.resolve.DescriptorRenderer; import java.net.URL; @@ -49,6 +50,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { private BindingContext bindingContext = null; private final Object lock = new Object(); + private static final FqName TUPLE0_FQ_NAME = DescriptorUtils.getFQName(JetStandardClasses.getTuple(0)).toSafe(); public StandardLibraryReferenceResolver(Project project) { super(project); @@ -72,7 +74,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { BindingTraceContext context = new BindingTraceContext(); FakeJetNamespaceDescriptor jetNamespace = new FakeJetNamespaceDescriptor(); - context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, new FqName("jet"), jetNamespace); + context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, JetStandardClasses.STANDARD_CLASSES_FQNAME, jetNamespace); WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, jetNamespace, RedeclarationHandler.THROW_EXCEPTION) .setDebugName("Builtin classes scope"); @@ -81,7 +83,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet.src")); - ClassDescriptor tuple0 = context.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, new FqName("jet.Tuple0")); + ClassDescriptor tuple0 = context.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, TUPLE0_FQ_NAME); assert tuple0 != null; scope = new WritableScopeImpl(scope, jetNamespace, RedeclarationHandler.THROW_EXCEPTION).setDebugName("Builtin classes scope #2"); scope.changeLockLevel(WritableScope.LockLevel.BOTH); @@ -134,7 +136,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { } String renderedOriginal = DescriptorRenderer.TEXT.render(originalDescriptor); for (DeclarationDescriptor member : memberScope.getAllDescriptors()) { - if (renderedOriginal.equals(DescriptorRenderer.TEXT.render(member).replace("jet.Tuple0", "Unit"))) { + if (renderedOriginal.equals(DescriptorRenderer.TEXT.render(member).replace(TUPLE0_FQ_NAME.getFqName(), "Unit"))) { return member; } } @@ -167,9 +169,9 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { private WritableScope memberScope; private FakeJetNamespaceDescriptor() { - super(new NamespaceDescriptorImpl(new ModuleDescriptor(""), - Collections.emptyList(), - ""), Collections.emptyList(), "jet"); + super(new NamespaceDescriptorImpl(new ModuleDescriptor(""), Collections.emptyList(), ""), + Collections.emptyList(), + JetStandardClasses.STANDARD_CLASSES_NAMESPACE.getName()); } void setMemberScope(WritableScope memberScope) { From e294a8821f39c02add4dec4e5eb42eae030e1523 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 15 May 2012 12:40:01 +0400 Subject: [PATCH 48/88] Introduced JetStandardClasses.UNIT_ALIAS constant, got rid of hard-coding it in all code except for tests. --- .../frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java | 3 ++- .../lang/types/expressions/BasicExpressionTypingVisitor.java | 2 +- .../jetbrains/jet/lang/types/lang/JetStandardClasses.java | 4 +++- .../src/org/jetbrains/jet/resolve/DescriptorRenderer.java | 2 +- .../plugin/references/StandardLibraryReferenceResolver.java | 5 +++-- j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java | 3 ++- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index cde638bb6a7..f08411886d9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -25,6 +25,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.ImportPath; +import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lexer.JetTokens; import java.util.Collection; @@ -307,7 +308,7 @@ public class JetPsiUtil { return false; } - return "Unit".equals(typeReference.getText()); + return JetStandardClasses.UNIT_ALIAS.equals(typeReference.getText()); } public static boolean isSafeCall(@NotNull Call call) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 085b44dca70..d63355109b3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -746,7 +746,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { JetType result; if (operationType == JetTokens.PLUSPLUS || operationType == JetTokens.MINUSMINUS) { if (JetTypeChecker.INSTANCE.isSubtypeOf(returnType, JetStandardClasses.getUnitType())) { - result = ErrorUtils.createErrorType("Unit"); + result = ErrorUtils.createErrorType(JetStandardClasses.UNIT_ALIAS); context.trace.report(INC_DEC_SHOULD_NOT_RETURN_UNIT.on(operationSign)); } else { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java index 409fa5a11a9..e8824f799a3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java @@ -258,12 +258,14 @@ public class JetStandardClasses { @NotNull public static final JetScope STANDARD_CLASSES; + public static final String UNIT_ALIAS = "Unit"; + static { WritableScope writableScope = new WritableScopeImpl(JetScope.EMPTY, STANDARD_CLASSES_NAMESPACE, RedeclarationHandler.DO_NOTHING).setDebugName("JetStandardClasses.STANDARD_CLASSES"); writableScope.changeLockLevel(WritableScope.LockLevel.BOTH); STANDARD_CLASSES = writableScope; - writableScope.addClassifierAlias("Unit", getTuple(0)); + writableScope.addClassifierAlias(UNIT_ALIAS, getTuple(0)); Field[] declaredFields = JetStandardClasses.class.getDeclaredFields(); for (Field field : declaredFields) { diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index d18b2c2c768..a92f13a38b2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -118,7 +118,7 @@ public class DescriptorRenderer implements Renderer { return escape("[NULL]"); } else if (JetStandardClasses.isUnit(type)) { - return escape("Unit" + (type.isNullable() ? "?" : "")); + return escape(JetStandardClasses.UNIT_ALIAS + (type.isNullable() ? "?" : "")); } else if (JetStandardClasses.isTupleType(type)) { return escape(renderTupleType(type, shortNamesOnly)); diff --git a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java index 1c783de0caf..31056babd82 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/StandardLibraryReferenceResolver.java @@ -87,7 +87,7 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { assert tuple0 != null; scope = new WritableScopeImpl(scope, jetNamespace, RedeclarationHandler.THROW_EXCEPTION).setDebugName("Builtin classes scope #2"); scope.changeLockLevel(WritableScope.LockLevel.BOTH); - scope.addClassifierAlias("Unit", tuple0); + scope.addClassifierAlias(JetStandardClasses.UNIT_ALIAS, tuple0); jetNamespace.setMemberScope(scope); TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, getJetFiles("jet")); @@ -136,7 +136,8 @@ public class StandardLibraryReferenceResolver extends AbstractProjectComponent { } String renderedOriginal = DescriptorRenderer.TEXT.render(originalDescriptor); for (DeclarationDescriptor member : memberScope.getAllDescriptors()) { - if (renderedOriginal.equals(DescriptorRenderer.TEXT.render(member).replace(TUPLE0_FQ_NAME.getFqName(), "Unit"))) { + if (renderedOriginal.equals(DescriptorRenderer.TEXT.render(member).replace(TUPLE0_FQ_NAME.getFqName(), + JetStandardClasses.UNIT_ALIAS))) { return member; } } diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 42f367619e3..17d85b6ac45 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -23,6 +23,7 @@ import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.J2KConverterFlags; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; +import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import java.util.LinkedList; import java.util.List; @@ -61,7 +62,7 @@ public class TypeVisitor extends PsiTypeVisitor implements J2KVisitor { final IdentifierImpl identifier = new IdentifierImpl(name); if (name.equals("void")) { - myResult = new PrimitiveType(new IdentifierImpl("Unit")); + myResult = new PrimitiveType(new IdentifierImpl(JetStandardClasses.UNIT_ALIAS)); } else if (Node.PRIMITIVE_TYPES.contains(name)) { myResult = new PrimitiveType(new IdentifierImpl(AstUtil.upperFirstCharacter(name))); From 554280a1b3f0ba2ea9fd5d770e730385b2875e0c Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 15 May 2012 15:11:10 +0400 Subject: [PATCH 49/88] Changed case of file name (localParameterInCallback.kt) to fix tests. --- .../{localParameterInCallBack.kt => localParameterInCallback.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename js/js.translator/testFiles/closure/cases/{localParameterInCallBack.kt => localParameterInCallback.kt} (100%) diff --git a/js/js.translator/testFiles/closure/cases/localParameterInCallBack.kt b/js/js.translator/testFiles/closure/cases/localParameterInCallback.kt similarity index 100% rename from js/js.translator/testFiles/closure/cases/localParameterInCallBack.kt rename to js/js.translator/testFiles/closure/cases/localParameterInCallback.kt From 4ab2588cbd51f8a070aefd0e13c3b6acccea072d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 15 May 2012 00:16:44 +0400 Subject: [PATCH 50/88] Made compiler aware of multiple alt-header paths. --- .../jetbrains/jet/cli/jvm/K2JVMCompiler.java | 28 +++++++++--- .../jet/cli/jvm/K2JVMCompilerArguments.java | 4 +- .../cli/jvm/compiler/JetCoreEnvironment.java | 2 +- .../resolve/java/CompilerDependencies.java | 43 +++++++++++++------ .../resolve/java/PsiClassFinderForJvm.java | 2 +- .../jet/CompileCompilerDependenciesTest.java | 5 ++- .../src/org/jetbrains/jet/utils/PathUtil.java | 3 +- 7 files changed, 62 insertions(+), 25 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java index b7d2a4b8935..0640e7729a2 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java @@ -19,6 +19,10 @@ package org.jetbrains.jet.cli.jvm; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.intellij.openapi.Disposable; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import jet.modules.Module; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.cli.common.CLICompiler; @@ -36,6 +40,7 @@ import org.jetbrains.jet.utils.PathUtil; import java.io.File; import java.io.PrintStream; import java.util.List; +import java.util.regex.Pattern; import static org.jetbrains.jet.cli.common.ExitCode.*; @@ -55,17 +60,18 @@ public class K2JVMCompiler extends CLICompiler() { + @Override + public File fun(String s) { + return new File(s); + } + }, new File[0]); + } } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompilerArguments.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompilerArguments.java index 42abc201d44..b739fe9b46c 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompilerArguments.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompilerArguments.java @@ -54,8 +54,8 @@ public class K2JVMCompilerArguments extends CompilerArguments { @Argument(value = "stdlib", description = "Path to the stdlib.jar") public String stdlib; - @Argument(value = "jdkHeaders", description = "Path to the kotlin-jdk-headers.jar") - public String jdkHeaders; + @Argument(value = "altHeaders", description = "Path to the alternative library headers paths") + public String altHeaders; @Argument(value = "mode", description = "Special compiler modes: stubs or jdkHeaders") public String mode; diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java index e9db023eee1..c5f03deebc4 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java @@ -85,7 +85,7 @@ public class JetCoreEnvironment extends JavaCoreEnvironment { } if (compilerSpecialMode.includeJdkHeaders()) { - for (VirtualFile root : compilerDependencies.getJdkHeaderRoots()) { + for (VirtualFile root : compilerDependencies.getAltHeaderRoots()) { addLibraryRoot(root); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerDependencies.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerDependencies.java index 226771fe4b5..29d78529fb4 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerDependencies.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerDependencies.java @@ -16,7 +16,11 @@ package org.jetbrains.jet.lang.resolve.java; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.utils.PathUtil; @@ -34,15 +38,15 @@ public class CompilerDependencies { private final CompilerSpecialMode compilerSpecialMode; @Nullable private final File jdkJar; - @Nullable - private final File jdkHeadersJar; + @NotNull + private final File[] altHeadersClasspath; @Nullable private final File runtimeJar; - public CompilerDependencies(@NotNull CompilerSpecialMode compilerSpecialMode, @Nullable File jdkJar, @Nullable File jdkHeadersJar, @Nullable File runtimeJar) { + public CompilerDependencies(@NotNull CompilerSpecialMode compilerSpecialMode, @Nullable File jdkJar, @NotNull File[] altHeadersClasspath, @Nullable File runtimeJar) { this.compilerSpecialMode = compilerSpecialMode; this.jdkJar = jdkJar; - this.jdkHeadersJar = jdkHeadersJar; + this.altHeadersClasspath = altHeadersClasspath; this.runtimeJar = runtimeJar; if (compilerSpecialMode.includeJdk()) { @@ -51,8 +55,8 @@ public class CompilerDependencies { } } if (compilerSpecialMode.includeJdkHeaders()) { - if (jdkHeadersJar == null) { - throw new IllegalArgumentException("jdkHeaders must be included for mode " + compilerSpecialMode); + if (altHeadersClasspath.length == 0) { + throw new IllegalArgumentException("altHeaders must be included for mode " + compilerSpecialMode); } } if (compilerSpecialMode.includeKotlinRuntime()) { @@ -72,9 +76,9 @@ public class CompilerDependencies { return jdkJar; } - @Nullable - public File getJdkHeadersJar() { - return jdkHeadersJar; + @NotNull + public File[] getAltHeadersClassPath() { + return altHeadersClasspath; } @Nullable @@ -83,9 +87,24 @@ public class CompilerDependencies { } @NotNull - public List getJdkHeaderRoots() { + public List getAltHeaderRoots() { if (compilerSpecialMode.includeJdkHeaders()) { - return Collections.singletonList(PathUtil.jarFileToVirtualFile(jdkHeadersJar)); + return ContainerUtil.map2List(altHeadersClasspath, new Function() { + @Override + public VirtualFile fun(File file) { + if (file.exists()) { + if (file.isDirectory()) { + return VirtualFileManager.getInstance().findFileByUrl("file://" + FileUtil.toSystemIndependentName(file.getAbsolutePath())); + } + else { + return PathUtil.jarFileToVirtualFile(file); + } + } + else { + throw new IllegalStateException("Path " + file + " does not exist."); + } + } + }); } else { return Collections.emptyList(); @@ -107,7 +126,7 @@ public class CompilerDependencies { return new CompilerDependencies( compilerSpecialMode, compilerSpecialMode.includeJdk() ? findRtJar() : null, - compilerSpecialMode.includeJdkHeaders() ? PathUtil.getAltHeadersPath() : null, + compilerSpecialMode.includeJdkHeaders() ? new File[]{PathUtil.getAltHeadersPath()} : new File[0], compilerSpecialMode.includeKotlinRuntime() ? PathUtil.getDefaultRuntimePath() : null); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java index 93d038f2f64..56a9a8a8b5e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java @@ -59,7 +59,7 @@ public class PsiClassFinderForJvm implements PsiClassFinder { @PostConstruct public void initialize() { - this.altClassFinder = new AltClassFinder(project, compilerDependencies.getJdkHeaderRoots()); + this.altClassFinder = new AltClassFinder(project, compilerDependencies.getAltHeaderRoots()); this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) { @Override public boolean contains(VirtualFile file) { diff --git a/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java b/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java index c3e084a4c68..be9b0f5ee05 100644 --- a/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java +++ b/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java @@ -22,9 +22,10 @@ import org.jetbrains.jet.codegen.forTestCompile.ForTestCompileJdkHeaders; import org.jetbrains.jet.codegen.forTestCompile.ForTestCompileRuntime; import org.jetbrains.jet.lang.resolve.java.CompilerDependencies; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; -import org.jetbrains.jet.utils.PathUtil; import org.junit.Test; +import java.io.File; + /** * @author Stepan Koltsov */ @@ -53,7 +54,7 @@ public class CompileCompilerDependenciesTest { return new CompilerDependencies( compilerSpecialMode, compilerSpecialMode.includeJdk() ? (mockJdk ? JetTestUtils.findMockJdkRtJar() : CompilerDependencies.findRtJar()) : null, - compilerSpecialMode.includeJdkHeaders() ? ForTestCompileJdkHeaders.jdkHeadersForTests() : null, + compilerSpecialMode.includeJdkHeaders() ? new File[]{ForTestCompileJdkHeaders.jdkHeadersForTests()} : new File[0], compilerSpecialMode.includeKotlinRuntime() ? ForTestCompileRuntime.runtimeJarForTests() : null); } } diff --git a/compiler/util/src/org/jetbrains/jet/utils/PathUtil.java b/compiler/util/src/org/jetbrains/jet/utils/PathUtil.java index 362ba0374e4..415ebabbd60 100644 --- a/compiler/util/src/org/jetbrains/jet/utils/PathUtil.java +++ b/compiler/util/src/org/jetbrains/jet/utils/PathUtil.java @@ -20,6 +20,7 @@ package org.jetbrains.jet.utils; import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import org.jetbrains.annotations.NotNull; @@ -106,6 +107,6 @@ public class PathUtil { if (!file.exists() || !file.isFile()) { throw new IllegalStateException("file must exist and be regular to be converted to virtual file: " + file); } - return VirtualFileManager.getInstance().findFileByUrl("jar://" + file.getPath() + "!/"); + return VirtualFileManager.getInstance().findFileByUrl("jar://" + FileUtil.toSystemIndependentName(file.getAbsolutePath()) + "!/"); } } From 15f6e7403e0fd02a93ff6fa07f9cd04d20800b2c Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 15 May 2012 13:24:18 +0400 Subject: [PATCH 51/88] Renamed jdkHeaders to altHeaders in all places where it makes sense. --- build.xml | 2 +- .../jetbrains/jet/cli/jvm/K2JVMCompiler.java | 6 +- .../jet/cli/jvm/K2JVMCompilerArguments.java | 2 +- .../cli/jvm/compiler/JetCoreEnvironment.java | 2 +- .../resolve/java/CompilerDependencies.java | 9 +- .../resolve/java/CompilerSpecialMode.java | 6 +- .../integration-tests/data/help/help.expected | 4 +- .../jet/CompileCompilerDependenciesTest.java | 2 +- .../jvm/compiler/CompileEnvironmentTest.java | 4 +- .../compiler/JavaDescriptorResolverTest.java | 4 +- .../jvm/compiler/ReadJavaBinaryClassTest.java | 4 +- .../compiler/ReadKotlinBinaryClassTest.java | 6 +- .../jet/codegen/AnnotationGenTest.java | 2 +- .../jetbrains/jet/codegen/ArrayGenTest.java | 2 +- .../jet/codegen/BridgeMethodGenTest.java | 2 +- .../jetbrains/jet/codegen/ClassGenTest.java | 116 +++++++++--------- .../jet/codegen/ClosuresGenTest.java | 2 +- .../jet/codegen/ControlStructuresTest.java | 70 +++++------ .../jet/codegen/ExtensionFunctionsTest.java | 10 +- .../jet/codegen/FunctionGenTest.java | 2 +- .../jet/codegen/NamespaceGenTest.java | 2 +- .../jetbrains/jet/codegen/ObjectGenTest.java | 2 +- .../jet/codegen/PatternMatchingTest.java | 2 +- .../jet/codegen/PrimitiveTypesTest.java | 2 +- .../jet/codegen/PropertyGenTest.java | 44 +++---- .../jetbrains/jet/codegen/SafeRefTest.java | 2 +- .../jetbrains/jet/codegen/StringsTest.java | 2 +- .../jetbrains/jet/codegen/SuperGenTest.java | 2 +- .../org/jetbrains/jet/codegen/TraitsTest.java | 2 +- .../jetbrains/jet/codegen/TupleGenTest.java | 2 +- .../jetbrains/jet/codegen/TypeInfoTest.java | 2 +- .../org/jetbrains/jet/codegen/VarArgTest.java | 20 +-- .../ForTestCompileJdkHeaders.java | 2 +- .../jet/resolve/DescriptorRendererTest.java | 2 +- libraries/tools/kotlin-maven-plugin/pom.xml | 2 +- 35 files changed, 172 insertions(+), 175 deletions(-) diff --git a/build.xml b/build.xml index bfba0a2c86a..8e166b40f0d 100644 --- a/build.xml +++ b/build.xml @@ -337,7 +337,7 @@ - + diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java index 0640e7729a2..ceec5289e7d 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.cli.jvm; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.intellij.openapi.Disposable; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; @@ -40,7 +39,6 @@ import org.jetbrains.jet.utils.PathUtil; import java.io.File; import java.io.PrintStream; import java.util.List; -import java.util.regex.Pattern; import static org.jetbrains.jet.cli.common.ExitCode.*; @@ -61,7 +59,7 @@ public class K2JVMCompiler extends CLICompiler getAltHeaderRoots() { - if (compilerSpecialMode.includeJdkHeaders()) { + if (compilerSpecialMode.includeAltHeaders()) { return ContainerUtil.map2List(altHeadersClasspath, new Function() { @Override public VirtualFile fun(File file) { if (file.exists()) { if (file.isDirectory()) { - return VirtualFileManager.getInstance().findFileByUrl("file://" + FileUtil.toSystemIndependentName(file.getAbsolutePath())); + return VirtualFileManager.getInstance() + .findFileByUrl("file://" + FileUtil.toSystemIndependentName(file.getAbsolutePath())); } else { return PathUtil.jarFileToVirtualFile(file); @@ -126,7 +127,7 @@ public class CompilerDependencies { return new CompilerDependencies( compilerSpecialMode, compilerSpecialMode.includeJdk() ? findRtJar() : null, - compilerSpecialMode.includeJdkHeaders() ? new File[]{PathUtil.getAltHeadersPath()} : new File[0], + compilerSpecialMode.includeAltHeaders() ? new File[]{PathUtil.getAltHeadersPath()} : new File[0], compilerSpecialMode.includeKotlinRuntime() ? PathUtil.getDefaultRuntimePath() : null); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerSpecialMode.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerSpecialMode.java index a75759cc274..3b08b9472c8 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerSpecialMode.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerSpecialMode.java @@ -22,13 +22,13 @@ package org.jetbrains.jet.lang.resolve.java; public enum CompilerSpecialMode { REGULAR, BUILTINS, - JDK_HEADERS, + ALT_HEADERS, STDLIB, IDEA, JS, ; - public boolean includeJdkHeaders() { + public boolean includeAltHeaders() { return this == REGULAR || this == STDLIB || this == IDEA; } @@ -41,6 +41,6 @@ public enum CompilerSpecialMode { } public boolean isStubs() { - return this == BUILTINS || this == JDK_HEADERS; + return this == BUILTINS || this == ALT_HEADERS; } } diff --git a/compiler/integration-tests/data/help/help.expected b/compiler/integration-tests/data/help/help.expected index a242b6e0d96..8f8c48e3972 100644 --- a/compiler/integration-tests/data/help/help.expected +++ b/compiler/integration-tests/data/help/help.expected @@ -4,8 +4,8 @@ OUT -src [String] source file or directory OUT -classpath [String] classpath to use when compiling OUT -includeRuntime [flag] OUT -stdlib [String] Path to the stdlib.jar -OUT -jdkHeaders [String] Path to the kotlin-jdk-headers.jar -OUT -mode [String] Special compiler modes: stubs or jdkHeaders +OUT -altHeaders [String] Path to the alternative library headers paths +OUT -mode [String] Special compiler modes: stubs or altHeaders OUT -output [String] output directory OUT -module [String] module to compile OUT -tags [flag] diff --git a/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java b/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java index be9b0f5ee05..11a991a7ee7 100644 --- a/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java +++ b/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java @@ -54,7 +54,7 @@ public class CompileCompilerDependenciesTest { return new CompilerDependencies( compilerSpecialMode, compilerSpecialMode.includeJdk() ? (mockJdk ? JetTestUtils.findMockJdkRtJar() : CompilerDependencies.findRtJar()) : null, - compilerSpecialMode.includeJdkHeaders() ? new File[]{ForTestCompileJdkHeaders.jdkHeadersForTests()} : new File[0], + compilerSpecialMode.includeAltHeaders() ? new File[]{ForTestCompileJdkHeaders.jdkHeadersForTests()} : new File[0], compilerSpecialMode.includeKotlinRuntime() ? ForTestCompileRuntime.runtimeJarForTests() : null); } } diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentTest.java b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentTest.java index 57ddba262e0..b0ecc5116a3 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentTest.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentTest.java @@ -50,7 +50,7 @@ public class CompileEnvironmentTest extends TestCase { "-module", JetParsingTest.getTestDataDir() + "/compiler/smoke/Smoke.kts", "-jar", resultJar.getAbsolutePath(), "-stdlib", stdlib.getAbsolutePath(), - "-jdkHeaders", jdkHeaders.getAbsolutePath()); + "-altHeaders", jdkHeaders.getAbsolutePath()); Assert.assertEquals("compilation completed with non-zero code", ExitCode.OK, rv); FileInputStream fileInputStream = new FileInputStream(resultJar); try { @@ -81,7 +81,7 @@ public class CompileEnvironmentTest extends TestCase { File jdkHeaders = ForTestCompileJdkHeaders.jdkHeadersForTests(); ExitCode exitCode = new K2JVMCompiler() .exec(System.out, "-src", JetParsingTest.getTestDataDir() + "/compiler/smoke/Smoke.kt", "-output", - out.getAbsolutePath(), "-stdlib", stdlib.getAbsolutePath(), "-jdkHeaders", jdkHeaders.getAbsolutePath()); + out.getAbsolutePath(), "-stdlib", stdlib.getAbsolutePath(), "-altHeaders", jdkHeaders.getAbsolutePath()); Assert.assertEquals(ExitCode.OK, exitCode); assertEquals(1, out.listFiles().length); assertEquals(1, out.listFiles()[0].listFiles().length); diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/JavaDescriptorResolverTest.java b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/JavaDescriptorResolverTest.java index dbd90b02473..b76ba55a971 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/JavaDescriptorResolverTest.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/JavaDescriptorResolverTest.java @@ -26,12 +26,10 @@ import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; -import org.jetbrains.jet.lang.types.TypeProjection; import org.junit.Assert; import java.io.File; import java.io.IOException; -import java.util.Collections; import java.util.Set; /** @@ -67,7 +65,7 @@ public class JavaDescriptorResolverTest extends TestCaseWithTmpdir { JetTestUtils.compileJavaFile(new File("compiler/testData/javaDescriptorResolver/" + fileRelativePath), tmpdir); JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations( - myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS); + myTestRootDisposable, CompilerSpecialMode.ALT_HEADERS); jetCoreEnvironment.addToClasspath(tmpdir); InjectorForJavaSemanticServices injector = new InjectorForJavaSemanticServices( diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/ReadJavaBinaryClassTest.java b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/ReadJavaBinaryClassTest.java index 4b67e197ad5..c6093aeb94e 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/ReadJavaBinaryClassTest.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/ReadJavaBinaryClassTest.java @@ -77,7 +77,7 @@ public class ReadJavaBinaryClassTest extends TestCaseWithTmpdir { @NotNull private NamespaceDescriptor compileKotlin() throws Exception { - JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS); + JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.ALT_HEADERS); String text = FileUtil.loadFile(ktFile); @@ -109,7 +109,7 @@ public class ReadJavaBinaryClassTest extends TestCaseWithTmpdir { fileManager.close(); } - JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS); + JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.ALT_HEADERS); jetCoreEnvironment.addToClasspath(tmpdir); jetCoreEnvironment.addToClasspath(new File("out/production/runtime")); diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/ReadKotlinBinaryClassTest.java b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/ReadKotlinBinaryClassTest.java index 10998b321a4..54228d13952 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/ReadKotlinBinaryClassTest.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/compiler/ReadKotlinBinaryClassTest.java @@ -62,7 +62,7 @@ public class ReadKotlinBinaryClassTest extends TestCaseWithTmpdir { @Override public void runTest() throws Exception { - jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS); + jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.ALT_HEADERS); String text = FileUtil.loadFile(testFile); @@ -70,7 +70,7 @@ public class ReadKotlinBinaryClassTest extends TestCaseWithTmpdir { virtualFile.setCharset(CharsetToolkit.UTF8_CHARSET); JetFile psiFile = (JetFile) ((PsiFileFactoryImpl) PsiFileFactory.getInstance(jetCoreEnvironment.getProject())).trySetupPsiForFile(virtualFile, JetLanguage.INSTANCE, true, false); - GenerationState state = GenerationUtils.compileFileGetGenerationStateForTest(psiFile, CompilerSpecialMode.JDK_HEADERS); + GenerationState state = GenerationUtils.compileFileGetGenerationStateForTest(psiFile, CompilerSpecialMode.ALT_HEADERS); ClassFileFactory classFileFactory = state.getFactory(); @@ -83,7 +83,7 @@ public class ReadKotlinBinaryClassTest extends TestCaseWithTmpdir { Disposer.dispose(myTestRootDisposable); - jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS); + jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.ALT_HEADERS); jetCoreEnvironment.addToClasspath(tmpdir); jetCoreEnvironment.addToClasspath(new File("out/production/runtime")); diff --git a/compiler/tests/org/jetbrains/jet/codegen/AnnotationGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/AnnotationGenTest.java index a0dd3390643..8397678334c 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/AnnotationGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/AnnotationGenTest.java @@ -29,7 +29,7 @@ public class AnnotationGenTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testPropField() throws NoSuchFieldException, NoSuchMethodException { diff --git a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java index 8193d92ebc5..6ae352a8a7e 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java @@ -25,7 +25,7 @@ public class ArrayGenTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testKt238 () throws Exception { diff --git a/compiler/tests/org/jetbrains/jet/codegen/BridgeMethodGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/BridgeMethodGenTest.java index d94b30d473c..ce661a98063 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/BridgeMethodGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/BridgeMethodGenTest.java @@ -20,7 +20,7 @@ import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; public class BridgeMethodGenTest extends CodegenTestCase { public void testBridgeMethod () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("bridge.jet"); } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index 89dd8c7c6b8..0ccfdd45560 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -35,7 +35,7 @@ public class ClassGenTest extends CodegenTestCase { } public void testPSVMClass() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile("classes/simpleClass.jet"); final Class aClass = loadClass("SimpleClass", generateClassesInFile()); @@ -46,7 +46,7 @@ public class ClassGenTest extends CodegenTestCase { } public void testArrayListInheritance() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile("classes/inheritingFromArrayList.jet"); // System.out.println(generateToText()); final Class aClass = loadClass("Foo", generateClassesInFile()); @@ -54,37 +54,37 @@ public class ClassGenTest extends CodegenTestCase { } public void testInheritanceAndDelegation_DelegatingDefaultConstructorProperties() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/inheritance.jet"); } public void testInheritanceAndDelegation2() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/delegation2.kt"); } public void testFunDelegation() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/funDelegation.jet"); } public void testPropertyDelegation() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/propertyDelegation.jet"); } public void testDiamondInheritance() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/diamondInheritance.jet"); } public void testRightHandOverride() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/rightHandOverride.jet"); } public void testNewInstanceExplicitConstructor() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile("classes/newInstanceDefaultConstructor.jet"); // System.out.println(generateToText()); final Method method = generateFunction("test"); @@ -93,22 +93,22 @@ public class ClassGenTest extends CodegenTestCase { } public void testInnerClass() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/innerClass.jet"); } public void testInheritedInnerClass() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/inheritedInnerClass.jet"); } public void testInitializerBlock() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/initializerBlock.jet"); } public void testAbstractMethod() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("abstract class Foo { abstract fun x(): String; fun y(): Int = 0 }"); final ClassFileFactory codegens = generateClassesInFile(); @@ -118,42 +118,42 @@ public class ClassGenTest extends CodegenTestCase { } public void testInheritedMethod() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/inheritedMethod.jet"); } public void testInitializerBlockDImpl() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/initializerBlockDImpl.jet"); } public void testPropertyInInitializer() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/propertyInInitializer.jet"); } public void testOuterThis() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/outerThis.jet"); } public void testSecondaryConstructors() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/secondaryConstructors.jet"); } public void testExceptionConstructor() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/exceptionConstructor.jet"); } public void testSimpleBox() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/simpleBox.jet"); } public void testAbstractClass() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("abstract class SimpleClass() { }"); final Class aClass = createClassLoader(generateClassesInFile()).loadClass("SimpleClass"); @@ -161,18 +161,18 @@ public class ClassGenTest extends CodegenTestCase { } public void testClassObject() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/classObject.jet"); } public void testClassObjectMethod() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); // todo to be implemented after removal of type info // blackBoxFile("classes/classObjectMethod.jet"); } public void testClassObjectInterface() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile("classes/classObjectInterface.jet"); final Method method = generateFunction(); Object result = method.invoke(null); @@ -180,32 +180,32 @@ public class ClassGenTest extends CodegenTestCase { } public void testOverloadBinaryOperator() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/overloadBinaryOperator.jet"); } public void testOverloadUnaryOperator() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/overloadUnaryOperator.jet"); } public void testOverloadPlusAssign() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/overloadPlusAssign.jet"); } public void testOverloadPlusAssignReturn() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/overloadPlusAssignReturn.jet"); } public void testOverloadPlusToPlusAssign() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/overloadPlusToPlusAssign.jet"); } public void testEnumClass() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("enum class Direction { NORTH; SOUTH; EAST; WEST }"); final Class direction = createClassLoader(generateClassesInFile()).loadClass("Direction"); // System.out.println(generateToText()); @@ -215,7 +215,7 @@ public class ClassGenTest extends CodegenTestCase { } public void testEnumConstantConstructors() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("enum class Color(val rgb: Int) { RED: Color(0xFF0000); GREEN: Color(0x00FF00); }"); final Class colorClass = createClassLoader(generateClassesInFile()).loadClass("Color"); final Field redField = colorClass.getField("RED"); @@ -225,25 +225,25 @@ public class ClassGenTest extends CodegenTestCase { } public void testClassObjFields() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("class A() { class object { val value = 10 } }\n" + "fun box() = if(A.value == 10) \"OK\" else \"fail\""); blackBox(); } public void testKt249() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt249.jet"); } public void testKt48 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt48.jet"); // System.out.println(generateToText()); } public void testKt309 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun box() = null"); final Method method = generateFunction("box"); assertEquals(method.getReturnType().getName(), "java.lang.Object"); @@ -251,73 +251,73 @@ public class ClassGenTest extends CodegenTestCase { } public void testKt343 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt343.jet"); // System.out.println(generateToText()); } public void testKt508 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile("regressions/kt508.jet"); // System.out.println(generateToText()); blackBox(); } public void testKt504 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile("regressions/kt504.jet"); // System.out.println(generateToText()); blackBox(); } public void testKt501 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt501.jet"); } public void testKt496 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt496.jet"); // System.out.println(generateToText()); } public void testKt500 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt500.jet"); } public void testKt694 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); // blackBoxFile("regressions/kt694.jet"); } public void testKt285 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); // blackBoxFile("regressions/kt285.jet"); } public void testKt707 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt707.jet"); } public void testKt857 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); // blackBoxFile("regressions/kt857.jet"); } public void testKt903 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt903.jet"); } public void testKt940 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt940.kt"); } public void testKt1018 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1018.kt"); } @@ -332,17 +332,17 @@ public class ClassGenTest extends CodegenTestCase { } public void testKt1134() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1134.kt"); } public void testKt1157() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1157.kt"); } public void testKt471() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt471.kt"); } @@ -352,38 +352,38 @@ public class ClassGenTest extends CodegenTestCase { } public void testKt723() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt723.kt"); } public void testKt725() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt725.kt"); } public void testKt633() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt633.kt"); } public void testKt1345() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1345.kt"); } public void testKt1538() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1538.kt"); } public void testKt1759() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1759.kt"); } public void testResolveOrder() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("classes/resolveOrder.jet"); } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java index f83c43d5fcd..67d5dc38738 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java @@ -26,7 +26,7 @@ public class ClosuresGenTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testSimplestClosure() throws Exception { diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index 3bf9fadee39..e909820bbae 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -33,7 +33,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testIf() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); @@ -43,7 +43,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testSingleBranchIf() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); @@ -65,7 +65,7 @@ public class ControlStructuresTest extends CodegenTestCase { } private void factorialTest(final String name) throws IllegalAccessException, InvocationTargetException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(name); // System.out.println(generateToText()); @@ -75,7 +75,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testContinue() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -84,7 +84,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testIfNoElse() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -93,7 +93,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testCondJumpOnStack() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("import java.lang.Boolean as jlBoolean; fun foo(a: String): Int = if (jlBoolean.parseBoolean(a)) 5 else 10"); final Method main = generateFunction(); assertEquals(5, main.invoke(null, "true")); @@ -101,7 +101,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testFor() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -110,7 +110,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testIfBlock() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -121,7 +121,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testForInArray() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -130,7 +130,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testForInRange() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun foo(sb: StringBuilder) { for(x in 1..4) sb.append(x) }"); final Method main = generateFunction(); StringBuilder stringBuilder = new StringBuilder(); @@ -139,7 +139,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testThrowCheckedException() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun foo() { throw Exception(); }"); final Method main = generateFunction(); boolean caught = false; @@ -154,7 +154,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testTryCatch() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -163,7 +163,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testTryFinally() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -183,37 +183,37 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testForUserType() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("controlStructures/forUserType.jet"); } public void testForIntArray() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("controlStructures/forIntArray.jet"); } public void testForPrimitiveIntArray() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("controlStructures/forPrimitiveIntArray.jet"); } public void testForNullableIntArray() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("controlStructures/forNullableIntArray.jet"); } public void testForIntRange() { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("controlStructures/forIntRange.jet"); } public void testKt237() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt237.jet"); } public void testCompareToNull() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun foo(a: String?, b: String?): Boolean = a == null && b !== null && null == a && null !== b"); String text = generateToText(); assertTrue(!text.contains("java/lang/Object.equals")); @@ -224,7 +224,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testCompareToNonnullableEq() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun foo(a: String?, b: String): Boolean = a == b || b == a"); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -233,7 +233,7 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testCompareToNonnullableNotEq() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun foo(a: String?, b: String): Boolean = a != b"); String text = generateToText(); // System.out.println(text); @@ -244,18 +244,18 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testKt299() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt299.jet"); } public void testKt416() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt416.jet"); // System.out.println(generateToText()); } public void testKt513() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt513.jet"); } @@ -265,37 +265,37 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testKt769() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt769.jet"); // System.out.println(generateToText()); } public void testKt773() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt773.jet"); // System.out.println(generateToText()); } public void testKt772() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt772.jet"); // System.out.println(generateToText()); } public void testKt870() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt870.jet"); // System.out.println(generateToText()); } public void testKt958() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt958.jet"); // System.out.println(generateToText()); } public void testQuicksort() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("controlStructures/quicksort.jet"); // System.out.println(generateToText()); } @@ -313,22 +313,22 @@ public class ControlStructuresTest extends CodegenTestCase { } public void testKt1076() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1076.kt"); } public void testKt998() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt998.kt"); } public void testKt628() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt628.kt"); } public void testKt1441() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1441.kt"); } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java b/compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java index 268b7eeb884..c1efeff745d 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java @@ -31,7 +31,7 @@ public class ExtensionFunctionsTest extends CodegenTestCase { } public void testSimple() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); final Method foo = generateFunction("foo"); final Character c = (Character) foo.invoke(null); @@ -39,7 +39,7 @@ public class ExtensionFunctionsTest extends CodegenTestCase { } public void testWhenFail() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); // System.out.println(generateToText()); Method foo = generateFunction("foo"); @@ -47,18 +47,18 @@ public class ExtensionFunctionsTest extends CodegenTestCase { } public void testVirtual() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("extensionFunctions/virtual.jet"); } public void testShared() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("extensionFunctions/shared.kt"); // System.out.println(generateToText()); } public void testKt475() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt475.jet"); } diff --git a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java index 67fd1abe0a4..0a1cceffb93 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java @@ -32,7 +32,7 @@ public class FunctionGenTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testDefaultArgs() throws Exception { diff --git a/compiler/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 4b70ebf58e6..7bee0120526 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -35,7 +35,7 @@ public class NamespaceGenTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testPSVM() throws Exception { diff --git a/compiler/tests/org/jetbrains/jet/codegen/ObjectGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ObjectGenTest.java index a051fa517e5..cf1251c36d2 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ObjectGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ObjectGenTest.java @@ -26,7 +26,7 @@ public class ObjectGenTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testSimpleObject() throws Exception { diff --git a/compiler/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java b/compiler/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java index b4cf3a09651..ab1e51b637c 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java @@ -29,7 +29,7 @@ public class PatternMatchingTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } @Override diff --git a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java index 87b58b2674b..82877887c1a 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java @@ -29,7 +29,7 @@ public class PrimitiveTypesTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testPlus() throws Exception { diff --git a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java index aaa0499c40e..e051e5a61e2 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java @@ -33,7 +33,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testPrivateVal() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); final Class aClass = loadImplementationClass(generateClassesInFile(), "PrivateVal"); final Field[] fields = aClass.getDeclaredFields(); @@ -43,7 +43,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testPrivateVar() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); final Class aClass = loadImplementationClass(generateClassesInFile(), "PrivateVar"); final Object instance = aClass.newInstance(); @@ -54,7 +54,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testPublicVar() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("class PublicVar() { public var foo : Int = 0; }"); final Class aClass = loadImplementationClass(generateClassesInFile(), "PublicVar"); final Object instance = aClass.newInstance(); @@ -65,7 +65,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testAccessorsInInterface() { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("class AccessorsInInterface() { public var foo : Int = 0; }"); final Class aClass = loadClass("AccessorsInInterface", generateClassesInFile()); assertNotNull(findMethodByName(aClass, "getFoo")); @@ -73,7 +73,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testPrivatePropertyInNamespace() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("private val x = 239"); final Class nsClass = generateNamespaceClass(); final Field[] fields = nsClass.getDeclaredFields(); @@ -86,7 +86,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testFieldPropertyAccess() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile("properties/fieldPropertyAccess.jet"); // System.out.println(generateToText()); final Method method = generateFunction(); @@ -95,14 +95,14 @@ public class PropertyGenTest extends CodegenTestCase { } public void testFieldGetter() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("val now: Long get() = System.currentTimeMillis(); fun foo() = now"); final Method method = generateFunction("foo"); assertIsCurrentTime((Long) method.invoke(null)); } public void testFieldSetter() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); final Method method = generateFunction("append"); method.invoke(null, "IntelliJ "); @@ -114,7 +114,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testFieldSetterPlusEq() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); final Method method = generateFunction("append"); method.invoke(null, "IntelliJ "); @@ -123,7 +123,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testAccessorsWithoutBody() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("class AccessorsWithoutBody() { protected var foo: Int = 349\n get\n private set\n fun setter() { foo = 610; } } "); // System.out.println(generateToText()); final Class aClass = loadImplementationClass(generateClassesInFile(), "AccessorsWithoutBody"); @@ -141,7 +141,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testInitializersForNamespaceProperties() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("val x = System.currentTimeMillis()"); final Method method = generateFunction("getX"); method.setAccessible(true); @@ -149,7 +149,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testPropertyReceiverOnStack() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadFile(); final Class aClass = loadImplementationClass(generateClassesInFile(), "Evaluator"); final Constructor constructor = aClass.getConstructor(StringBuilder.class); @@ -161,7 +161,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testAbstractVal() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("abstract class Foo { public abstract val x: String }"); final ClassFileFactory codegens = generateClassesInFile(); final Class aClass = loadClass("Foo", codegens); @@ -169,7 +169,7 @@ public class PropertyGenTest extends CodegenTestCase { } public void testVolatileProperty() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("abstract class Foo { public volatile var x: String = \"\"; }"); // System.out.println(generateToText()); final ClassFileFactory codegens = generateClassesInFile(); @@ -179,18 +179,18 @@ public class PropertyGenTest extends CodegenTestCase { } public void testKt257 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt257.jet"); // System.out.println(generateToText()); } public void testKt613 () throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt613.jet"); } public void testKt160() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("internal val s = java.lang.Double.toString(1.0)"); final Method method = generateFunction("getS"); method.setAccessible(true); @@ -198,12 +198,12 @@ public class PropertyGenTest extends CodegenTestCase { } public void testKt1165() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1165.kt"); } public void testKt1168() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1168.kt"); } @@ -213,17 +213,17 @@ public class PropertyGenTest extends CodegenTestCase { } public void testKt1159() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1159.kt"); } public void testKt1417() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1417.kt"); } public void testKt1398() throws Exception { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt1398.kt"); } diff --git a/compiler/tests/org/jetbrains/jet/codegen/SafeRefTest.java b/compiler/tests/org/jetbrains/jet/codegen/SafeRefTest.java index 82f1eaf5fa4..d2ae8182a31 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/SafeRefTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/SafeRefTest.java @@ -22,7 +22,7 @@ public class SafeRefTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void test247 () throws Exception { diff --git a/compiler/tests/org/jetbrains/jet/codegen/StringsTest.java b/compiler/tests/org/jetbrains/jet/codegen/StringsTest.java index 1858eacb7c7..3f97dafe6ac 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StringsTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StringsTest.java @@ -30,7 +30,7 @@ public class StringsTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testAnyToString () throws InvocationTargetException, IllegalAccessException { diff --git a/compiler/tests/org/jetbrains/jet/codegen/SuperGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/SuperGenTest.java index 46c469d61ad..33ecfff9a3a 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/SuperGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/SuperGenTest.java @@ -23,7 +23,7 @@ public class SuperGenTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } public void testBasicProperty () { diff --git a/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java b/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java index f690a0791d5..4da8f6e93c9 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java @@ -23,7 +23,7 @@ public class TraitsTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } @Override diff --git a/compiler/tests/org/jetbrains/jet/codegen/TupleGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/TupleGenTest.java index 7cda157836e..0e9444ac2bd 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TupleGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TupleGenTest.java @@ -20,7 +20,7 @@ import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; public class TupleGenTest extends CodegenTestCase { public void testBasic() { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("/tuples/basic.jet"); // System.out.println(generateToText()); } diff --git a/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java b/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java index f212dc4765d..638fb812338 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java @@ -29,7 +29,7 @@ public class TypeInfoTest extends CodegenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } @Override diff --git a/compiler/tests/org/jetbrains/jet/codegen/VarArgTest.java b/compiler/tests/org/jetbrains/jet/codegen/VarArgTest.java index 5be1db68f10..e53d4b39ec8 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/VarArgTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/VarArgTest.java @@ -27,7 +27,7 @@ import java.lang.reflect.Method; */ public class VarArgTest extends CodegenTestCase { public void testStringArray () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun test(vararg ts: String) = ts"); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -36,7 +36,7 @@ public class VarArgTest extends CodegenTestCase { } public void testIntArray () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun test(vararg ts: Int) = ts"); // System.out.println(generateToText()); final Method main = generateFunction(); @@ -45,7 +45,7 @@ public class VarArgTest extends CodegenTestCase { } public void testIntArrayKotlinNoArgs () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun test() = testf(); fun testf(vararg ts: Int) = ts"); // System.out.println(generateToText()); final Method main = generateFunction("test"); @@ -54,7 +54,7 @@ public class VarArgTest extends CodegenTestCase { } public void testIntArrayKotlin () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun test() = testf(239, 7); fun testf(vararg ts: Int) = ts"); // System.out.println(generateToText()); final Method main = generateFunction("test"); @@ -65,7 +65,7 @@ public class VarArgTest extends CodegenTestCase { } public void testNullableIntArrayKotlin () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun test() = testf(239.toByte(), 7.toByte()); fun testf(vararg ts: Byte?) = ts"); // System.out.println(generateToText()); final Method main = generateFunction("test"); @@ -76,7 +76,7 @@ public class VarArgTest extends CodegenTestCase { } public void testIntArrayKotlinObj () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun test() = testf(\"239\"); fun testf(vararg ts: String) = ts"); // System.out.println(generateToText()); final Method main = generateFunction("test"); @@ -86,7 +86,7 @@ public class VarArgTest extends CodegenTestCase { } public void testArrayT () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("fun test() = _array(2, 4); fun _array(vararg elements : T) = elements"); // System.out.println(generateToText()); final Method main = generateFunction("test"); @@ -102,12 +102,12 @@ public class VarArgTest extends CodegenTestCase { } public void testKt797() { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); blackBoxFile("regressions/kt796_797.jet"); } public void testArrayAsVararg () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("private fun asList(vararg elems: String) = elems; fun test(ts: Array) = asList(*ts); "); //System.out.println(generateToText()); final Method main = generateFunction("test"); @@ -116,7 +116,7 @@ public class VarArgTest extends CodegenTestCase { } public void testArrayAsVararg2 () throws InvocationTargetException, IllegalAccessException { - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); loadText("private fun asList(vararg elems: String) = elems; fun test(ts1: Array, ts2: String) = asList(*ts1, ts2); "); System.out.println(generateToText()); final Method main = generateFunction("test"); diff --git a/compiler/tests/org/jetbrains/jet/codegen/forTestCompile/ForTestCompileJdkHeaders.java b/compiler/tests/org/jetbrains/jet/codegen/forTestCompile/ForTestCompileJdkHeaders.java index b94fbbc14b5..1ea8a5f4be2 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/forTestCompile/ForTestCompileJdkHeaders.java +++ b/compiler/tests/org/jetbrains/jet/codegen/forTestCompile/ForTestCompileJdkHeaders.java @@ -39,7 +39,7 @@ public class ForTestCompileJdkHeaders { @Override protected void doCompile(@NotNull File classesDir) throws Exception { ExitCode exitCode = new K2JVMCompiler().exec( - System.err, "-output", classesDir.getPath(), "-src", "./jdk-headers/src", "-mode", "jdkHeaders"); + System.err, "-output", classesDir.getPath(), "-src", "./jdk-headers/src", "-mode", "altHeaders"); if (exitCode != ExitCode.OK) { throw new IllegalStateException("jdk headers compilation failed: " + exitCode); } diff --git a/compiler/tests/org/jetbrains/jet/resolve/DescriptorRendererTest.java b/compiler/tests/org/jetbrains/jet/resolve/DescriptorRendererTest.java index df7872b0324..96c3c4eb310 100644 --- a/compiler/tests/org/jetbrains/jet/resolve/DescriptorRendererTest.java +++ b/compiler/tests/org/jetbrains/jet/resolve/DescriptorRendererTest.java @@ -44,7 +44,7 @@ public class DescriptorRendererTest extends JetLiteFixture { @Override protected void setUp() throws Exception { super.setUp(); - createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.ALT_HEADERS); } diff --git a/libraries/tools/kotlin-maven-plugin/pom.xml b/libraries/tools/kotlin-maven-plugin/pom.xml index f7170466c65..f472eaf0b34 100644 --- a/libraries/tools/kotlin-maven-plugin/pom.xml +++ b/libraries/tools/kotlin-maven-plugin/pom.xml @@ -38,7 +38,7 @@ - + ${kotlin-sdk}/lib/alt false From 81d20dcf4b84b3ea6fc610106eb403ebe2646e77 Mon Sep 17 00:00:00 2001 From: Leonid Shalupov Date: Tue, 15 May 2012 16:26:52 +0200 Subject: [PATCH 52/88] build.xml: make it green --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 8e166b40f0d..c18e71c4903 100644 --- a/build.xml +++ b/build.xml @@ -134,7 +134,7 @@ - + From a8951284ace2d4522cc201f0b09f61cbbf27072f Mon Sep 17 00:00:00 2001 From: Leonid Shalupov Date: Tue, 15 May 2012 16:49:06 +0200 Subject: [PATCH 53/88] libraries: jdkHeaders -> altHeaders --- .../kotlin/maven/KotlinCompileMojoBase.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java index 95db5cd5dfc..994d1d5030f 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java @@ -23,10 +23,9 @@ import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.logging.Log; -import org.jetbrains.jet.cli.jvm.K2JVMCompilerArguments; -import org.jetbrains.jet.cli.jvm.K2JVMCompiler; -import org.jetbrains.jet.cli.common.ExitCode.*; import org.jetbrains.jet.cli.common.ExitCode; +import org.jetbrains.jet.cli.jvm.K2JVMCompiler; +import org.jetbrains.jet.cli.jvm.K2JVMCompilerArguments; import java.io.File; import java.io.IOException; @@ -204,8 +203,8 @@ public abstract class KotlinCompileMojoBase extends AbstractMojo { log.info("Classes directory is " + output); arguments.setOutputDir(output); - arguments.jdkHeaders = getJdkHeaders().getPath(); - log.debug("Using jdk headers from " + arguments.jdkHeaders); + arguments.altHeaders = getAltHeaders().getPath(); + log.debug("Using jdk headers from " + arguments.altHeaders); } // TODO: Make a better runtime detection or get rid of it entirely @@ -223,25 +222,25 @@ public abstract class KotlinCompileMojoBase extends AbstractMojo { return null; } - private File jdkHeadersPath; + private File altHeadersPath; - protected File getJdkHeaders() { - if (jdkHeadersPath != null) - return jdkHeadersPath; + protected File getAltHeaders() { + if (altHeadersPath != null) + return altHeadersPath; try { - jdkHeadersPath = extractJdkHeaders(); + altHeadersPath = extractAltHeaders(); - if (jdkHeadersPath == null) - throw new RuntimeException("Can't find kotlin jdk headers in maven plugin resources"); + if (altHeadersPath == null) + throw new RuntimeException("Can't find kotlin alt headers in maven plugin resources"); } catch (IOException e) { throw new RuntimeException(e); } - return jdkHeadersPath; + return altHeadersPath; } - private File extractJdkHeaders() throws IOException { + private File extractAltHeaders() throws IOException { final String kotlin_jdk_headers = "kotlin-jdk-headers.jar"; final URL jdkHeadersResource = Resources.getResource(kotlin_jdk_headers); From c689840eeeb1a070dbb20dd5b78bc60a4e40c236 Mon Sep 17 00:00:00 2001 From: Leonid Shalupov Date: Tue, 15 May 2012 18:21:35 +0200 Subject: [PATCH 54/88] jdk -> alt --- .../java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java index 994d1d5030f..a3c2342780d 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java @@ -204,7 +204,7 @@ public abstract class KotlinCompileMojoBase extends AbstractMojo { arguments.setOutputDir(output); arguments.altHeaders = getAltHeaders().getPath(); - log.debug("Using jdk headers from " + arguments.altHeaders); + log.debug("Using alt headers from " + arguments.altHeaders); } // TODO: Make a better runtime detection or get rid of it entirely From c6223fc0c2d02228b56bcf65bb98d648330e17d6 Mon Sep 17 00:00:00 2001 From: Leonid Shalupov Date: Tue, 15 May 2012 20:09:40 +0200 Subject: [PATCH 55/88] stream integration test logs --- libraries/tools/kotlin-maven-plugin/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/tools/kotlin-maven-plugin/pom.xml b/libraries/tools/kotlin-maven-plugin/pom.xml index cd3ba206d6e..8686ed9b25f 100644 --- a/libraries/tools/kotlin-maven-plugin/pom.xml +++ b/libraries/tools/kotlin-maven-plugin/pom.xml @@ -69,6 +69,7 @@ ${project.build.directory}/local-repo verify.bsh + true From e0be72d5b506c9783cfba13f715eac81af9bb8d5 Mon Sep 17 00:00:00 2001 From: develar Date: Sun, 13 May 2012 19:44:48 +0400 Subject: [PATCH 56/88] http://devnet.jetbrains.net/thread/436214?tstart=0 --- .../jet/cli/common/CompilerVersion.java | 2 +- .../jetbrains/jet/cli/js/K2JSCompiler.java | 4 +- .../jet/cli/js/K2JSCompilerArguments.java | 3 + .../jet/plugin/compiler/K2JSCompiler.java | 39 ++++++---- .../jet/plugin/project/IDEAConfig.java | 4 +- .../jet/plugin/project/JsModuleDetector.java | 40 +++++----- .../k2js/test/config/TestConfig.java | 2 +- .../src/org/jetbrains/k2js/config/Config.java | 17 ++++- .../config/ZippedLibrarySourcesConfig.java | 4 +- .../jetbrains/k2js/facade/K2JSTranslator.java | 3 +- .../k2js/translate/context/StaticContext.java | 35 +++++++-- .../translate/context/TranslationContext.java | 4 + .../ClassDeclarationTranslator.java | 2 +- .../declaration/ClassTranslator.java | 5 +- .../declaration/PropertyTranslator.java | 5 ++ .../k2js/translate/general/Translation.java | 11 ++- .../ClassInitializerTranslator.java | 27 +++++-- .../initializer/InitializerEcma5Visitor.java | 54 ++++++++++++++ .../initializer/InitializerVisitor.java | 73 ++++++++++--------- .../NamespaceInitializerTranslator.java | 9 +-- .../translate/reference/CallTranslator.java | 15 +++- .../NativePropertyAccessTranslator.java | 9 +-- .../reference/ReferenceTranslator.java | 11 ++- .../k2js/translate/utils/JsAstUtils.java | 47 ++++++++++++ .../translate/utils/TranslationUtils.java | 12 +-- 25 files changed, 307 insertions(+), 130 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java b/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java index 98f1b3940e6..34d17bc7b94 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java @@ -22,5 +22,5 @@ package org.jetbrains.jet.cli.common; public class CompilerVersion { // The value of this constant is generated by the build script // DON'T MODIFY IT - public static final String VERSION = "@snapshot@"; + public static final String VERSION = "snapshot"; } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java index 27114b42a1c..ec756937b4a 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java @@ -121,8 +121,8 @@ public class K2JSCompiler extends CLICompiler args = Lists.newArrayList("-tags", "-verbose", "-version"); addPathToSourcesDir(args, srcDir); - addOutputPath(project, outDir, args); - addPathToZippedLib(project, args); + addOutputPath(outFile, args); + Pair data = JsModuleDetector.getLibLocationAndTargetForProject(project); + if (data.first != null) { + args.add("-libzip"); + args.add(data.first); + } + if (data.second != null) { + args.add("-target"); + args.add(data.second); + } return ArrayUtil.toStringArray(args); } @@ -138,23 +155,13 @@ public final class K2JSCompiler implements TranslatingCompiler { args.add(srcPath); } - private static void addOutputPath(@NotNull Project project, @Nullable VirtualFile outDir, @NotNull ArrayList args) { - if (outDir != null) { - String outPath = outDir.getPath(); - String outFile = K2JSRunnerUtils.constructPathToGeneratedFile(project, outPath); + private static void addOutputPath(@Nullable String outFile, @NotNull ArrayList args) { + if (outFile != null) { args.add("-output"); args.add(outFile); } } - private static void addPathToZippedLib(@NotNull Project project, @NotNull ArrayList args) { - String libLocationForProject = JsModuleDetector.getLibLocationForProject(project); - if (libLocationForProject != null) { - args.add("-libzip"); - args.add(libLocationForProject); - } - } - @NotNull @Override public String getDescription() { diff --git a/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java b/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java index 4032da59ec2..d9fb9627575 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java +++ b/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java @@ -20,7 +20,7 @@ import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.k2js.config.ZippedLibrarySourcesConfig; -import static org.jetbrains.jet.plugin.project.JsModuleDetector.getLibLocationForProject; +import static org.jetbrains.jet.plugin.project.JsModuleDetector.getLibLocationAndTargetForProject; /** * @author Pavel Talanov @@ -28,6 +28,6 @@ import static org.jetbrains.jet.plugin.project.JsModuleDetector.getLibLocationFo public final class IDEAConfig extends ZippedLibrarySourcesConfig { public IDEAConfig(@NotNull Project project) { - super(project, getLibLocationForProject(project)); + super(project, getLibLocationAndTargetForProject(project).first, null); } } diff --git a/idea/src/org/jetbrains/jet/plugin/project/JsModuleDetector.java b/idea/src/org/jetbrains/jet/plugin/project/JsModuleDetector.java index c8849436032..efd5931a8e6 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/JsModuleDetector.java +++ b/idea/src/org/jetbrains/jet/plugin/project/JsModuleDetector.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.plugin.project; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; @@ -60,42 +61,35 @@ public final class JsModuleDetector { } //TODO: refactor - @Nullable - public static String getLibLocationForProject(@NotNull Project project) { + @NotNull + public static Pair getLibLocationAndTargetForProject(@NotNull Project project) { VirtualFile indicationFile = findIndicationFileInContentRoots(project); if (indicationFile == null) { - return null; + return Pair.empty(); } + try { InputStream stream = indicationFile.getInputStream(); - String path = FileUtil.loadTextAndClose(stream); - String pathToLibFile = getFirstLine(path); - if (pathToLibFile == null) { - return null; - } + BufferedReader reader = new BufferedReader(new StringReader(FileUtil.loadTextAndClose(stream))); try { + String pathToLibFile = reader.readLine(); + if (pathToLibFile == null) { + return Pair.empty(); + } + URI pathToLibFileUri = new URI(pathToLibFile); URI pathToIndicationFileUri = new URI(indicationFile.getPath()); - return pathToIndicationFileUri.resolve(pathToLibFileUri).toString(); + return new Pair(pathToIndicationFileUri.resolve(pathToLibFileUri).toString(), reader.readLine()); } catch (URISyntaxException e) { - return null; + return Pair.empty(); + } + finally { + reader.close(); } } catch (IOException e) { - return null; - } - } - - @Nullable - private static String getFirstLine(@NotNull String path) throws IOException { - BufferedReader reader = new BufferedReader(new StringReader(path)); - try { - return reader.readLine(); - } - - finally { - reader.close(); + return Pair.empty(); } } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java index 66760d4ebdd..021bc4494a0 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java @@ -41,7 +41,7 @@ public final class TestConfig extends Config { private /*var*/ List jsLibFiles = null; public TestConfig(@NotNull Project project) { - super(project); + super(project, null); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/config/Config.java b/js/js.translator/src/org/jetbrains/k2js/config/Config.java index ae3b12449be..f5bf2dcae15 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/Config.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/Config.java @@ -17,6 +17,7 @@ package org.jetbrains.k2js.config; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; @@ -25,6 +26,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import static org.jetbrains.k2js.translate.general.Translation.EcmaVersion; + /** * @author Pavel Talanov *

@@ -33,8 +36,8 @@ import java.util.List; public abstract class Config { @NotNull - public static Config getEmptyConfig(@NotNull Project project) { - return new Config(project) { + public static Config getEmptyConfig(@NotNull Project project, @Nullable String target) { + return new Config(project, target) { @NotNull @Override protected List generateLibFiles() { @@ -67,9 +70,12 @@ public abstract class Config { private final Project project; @Nullable private List libFiles = null; + @NotNull + private final EcmaVersion target; - public Config(@NotNull Project project) { + public Config(@NotNull Project project, @Nullable String target) { this.project = project; + this.target = StringUtil.compareVersionNumbers(target, "5") >= 0 ? EcmaVersion.v5 : EcmaVersion.v3; } @NotNull @@ -77,6 +83,11 @@ public abstract class Config { return project; } + @NotNull + public EcmaVersion getTarget() { + return target; + } + @NotNull protected abstract List generateLibFiles(); diff --git a/js/js.translator/src/org/jetbrains/k2js/config/ZippedLibrarySourcesConfig.java b/js/js.translator/src/org/jetbrains/k2js/config/ZippedLibrarySourcesConfig.java index dec84239cac..d873252e882 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/ZippedLibrarySourcesConfig.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/ZippedLibrarySourcesConfig.java @@ -40,8 +40,8 @@ public class ZippedLibrarySourcesConfig extends Config { @Nullable protected final String pathToLibZip; - public ZippedLibrarySourcesConfig(@NotNull Project project, @Nullable String pathToZip) { - super(project); + public ZippedLibrarySourcesConfig(@NotNull Project project, @Nullable String pathToZip, @Nullable String target) { + super(project, target); pathToLibZip = pathToZip; } diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java index 99a0c17ee32..18025ec0cc8 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -103,7 +103,8 @@ public final class K2JSTranslator { JetStandardLibrary.initialize(config.getProject()); BindingContext bindingContext = AnalyzerFacadeForJS.analyzeFilesAndCheckErrors(filesToTranslate, config); Collection files = AnalyzerFacadeForJS.withJsLibAdded(filesToTranslate, config); - return Translation.generateAst(bindingContext, Lists.newArrayList(files), mainCallParameters); + + return Translation.generateAst(bindingContext, Lists.newArrayList(files), mainCallParameters, config.getTarget()); } //TODO: util diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index 36ae40622ae..a1b50867982 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.k2js.translate.context.generator.Generator; import org.jetbrains.k2js.translate.context.generator.Rule; +import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; import org.jetbrains.k2js.translate.utils.AnnotationsUtils; import org.jetbrains.k2js.translate.utils.JsAstUtils; @@ -44,7 +45,7 @@ import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.*; public final class StaticContext { public static StaticContext generateStaticContext(@NotNull JetStandardLibrary library, - @NotNull BindingContext bindingContext) { + @NotNull BindingContext bindingContext, Translation.EcmaVersion ecmaVersion) { JsProgram program = new JsProgram("main"); JsRootScope jsRootScope = program.getRootScope(); Namer namer = Namer.newInstance(jsRootScope); @@ -52,7 +53,7 @@ public final class StaticContext { Intrinsics intrinsics = Intrinsics.standardLibraryIntrinsics(library); StandardClasses standardClasses = StandardClasses.bindImplementations(namer.getKotlinScope()); - return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, scope); + return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, scope, ecmaVersion); } @NotNull @@ -83,17 +84,24 @@ public final class StaticContext { @NotNull private final Map scopeToFunction = Maps.newHashMap(); + @NotNull + private final Translation.EcmaVersion ecmaVersion; //TODO: too many parameters in constructor private StaticContext(@NotNull JsProgram program, @NotNull BindingContext bindingContext, - @NotNull Namer namer, @NotNull Intrinsics intrinsics, - @NotNull StandardClasses standardClasses, @NotNull NamingScope rootScope) { + @NotNull Namer namer, @NotNull Intrinsics intrinsics, + @NotNull StandardClasses standardClasses, @NotNull NamingScope rootScope, @NotNull Translation.EcmaVersion ecmaVersion) { this.program = program; this.bindingContext = bindingContext; this.namer = namer; this.intrinsics = intrinsics; this.rootScope = rootScope; this.standardClasses = standardClasses; + this.ecmaVersion = ecmaVersion; + } + + public boolean isEcma5() { + return ecmaVersion == Translation.EcmaVersion.v5; } @NotNull @@ -219,8 +227,25 @@ public final class StaticContext { if (!(descriptor instanceof PropertyDescriptor)) { return null; } + NamingScope enclosingScope = getEnclosingScope(descriptor); - return enclosingScope.declareObfuscatableName(Namer.getKotlinBackingFieldName(descriptor.getName())); + if (isEcma5()) { + String name = descriptor.getName(); + PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; + if (!isDefaultAccessor(propertyDescriptor.getGetter()) || !isDefaultAccessor(propertyDescriptor.getSetter())) { + // _ is more preferable than $ — should be discussed later + name = '_' + name; + } + + return enclosingScope.declareUnobfuscatableName(name); + } + else { + return enclosingScope.declareObfuscatableName(Namer.getKotlinBackingFieldName(descriptor.getName())); + } + } + + private boolean isDefaultAccessor(PropertyAccessorDescriptor accessorDescriptor) { + return accessorDescriptor == null || accessorDescriptor.isDefault(); } }; //TODO: hack! diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 2ffea662b1d..a55a17687e9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -54,6 +54,10 @@ public final class TranslationContext { rootDynamicContext, rootAliasingContext); } + public boolean isEcma5() { + return staticContext.isEcma5(); + } + private TranslationContext(@NotNull StaticContext staticContext, @NotNull DynamicContext dynamicContext, @NotNull AliasingContext context) { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java index f1f803550b5..bf67a37340b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java @@ -36,8 +36,8 @@ import org.jetbrains.k2js.translate.utils.ClassSortingUtils; import java.util.ArrayList; import java.util.List; -import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getAllClassesDefinedInNamespace; import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; +import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getAllClassesDefinedInNamespace; /** * @author Pavel Talanov diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java index 9c6c9b1e2f2..c3c82da08a9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java @@ -213,7 +213,10 @@ public final class ClassTranslator extends AbstractTranslator { if (!isTrait()) { propertyList.add(Translation.generateClassInitializerMethod(classDeclaration, classDeclarationContext)); } - propertyList.addAll(translatePropertiesAsConstructorParameters(classDeclarationContext)); + // skip for ecma5, because accessors defined via Object.defineProperties + if (!context().isEcma5()) { + propertyList.addAll(translatePropertiesAsConstructorParameters(classDeclarationContext)); + } propertyList.addAll(declarationBodyVisitor.traverseClass(classDeclaration, classDeclarationContext)); return JsAstUtils.newObjectLiteral(propertyList); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java index 0488084bc17..b3130f3520b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java @@ -29,6 +29,7 @@ import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.Translation; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyForDescriptor; @@ -53,6 +54,10 @@ public final class PropertyTranslator extends AbstractTranslator { static public List translateAccessors(@NotNull PropertyDescriptor descriptor, @NotNull TranslationContext context) { + if (context.isEcma5()) { + return Collections.emptyList(); + } + PropertyTranslator propertyTranslator = new PropertyTranslator(descriptor, context); return propertyTranslator.translate(); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index a73256bc3bc..a477c0deaea 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -61,6 +61,9 @@ import static org.jetbrains.k2js.translate.utils.dangerous.DangerousData.collect * Goal is to simlify interaction between translators. */ public final class Translation { + public enum EcmaVersion { + v3, v5 + } private Translation() { } @@ -142,9 +145,9 @@ public final class Translation { @NotNull public static JsProgram generateAst(@NotNull BindingContext bindingContext, - @NotNull List files, @NotNull MainCallParameters mainCallParameters) throws TranslationException { + @NotNull List files, @NotNull MainCallParameters mainCallParameters, EcmaVersion ecmaVersion) throws TranslationException { try { - return doGenerateAst(bindingContext, files, mainCallParameters); + return doGenerateAst(bindingContext, files, mainCallParameters, ecmaVersion); } catch (UnsupportedOperationException e) { throw new UnsupportedFeatureException("Unsupported feature used.", e); @@ -156,10 +159,10 @@ public final class Translation { @NotNull private static JsProgram doGenerateAst(@NotNull BindingContext bindingContext, @NotNull List files, - @NotNull MainCallParameters mainCallParameters) throws MainFunctionNotFoundException { + @NotNull MainCallParameters mainCallParameters, EcmaVersion ecmaVersion) throws MainFunctionNotFoundException { //TODO: move some of the code somewhere JetStandardLibrary standardLibrary = JetStandardLibrary.getInstance(); - StaticContext staticContext = StaticContext.generateStaticContext(standardLibrary, bindingContext); + StaticContext staticContext = StaticContext.generateStaticContext(standardLibrary, bindingContext, ecmaVersion); JsBlock block = staticContext.getProgram().getFragmentBlock(0); TranslationContext context = TranslationContext.rootContext(staticContext); block.getStatements().addAll(translateFiles(files, context)); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java index f1438688fbd..c2ef7b08644 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; +import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.ArrayList; import java.util.List; @@ -43,12 +44,13 @@ import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateArgum * @author Pavel Talanov */ public final class ClassInitializerTranslator extends AbstractTranslator { - @NotNull private final JetClassOrObject classDeclaration; @NotNull private final List initializerStatements = new ArrayList(); + private final JsObjectLiteral propertiesDefinition = new JsObjectLiteral(); + public ClassInitializerTranslator(@NotNull JetClassOrObject classDeclaration, @NotNull TranslationContext context) { // Note: it's important we use scope for class descriptor because anonymous function used in property initializers // belong to the properties themselves @@ -65,8 +67,12 @@ public final class ClassInitializerTranslator extends AbstractTranslator { // for properties declared as constructor parameters setParameters(result, translatePrimaryConstructorParameters()); mayBeAddCallToSuperMethod(); - initializerStatements.addAll((new InitializerVisitor()).traverseClass(classDeclaration, context())); + initializerStatements.addAll((InitializerVisitor.create(context())).traverseClass(classDeclaration, context())); result.getBody().getStatements().addAll(initializerStatements); + if (!propertiesDefinition.getPropertyInitializers().isEmpty()) { + result.getBody().getStatements().add(JsAstUtils.defineProperties(propertiesDefinition)); + } + return InitializerUtils.generateInitializeMethod(result); } @@ -123,15 +129,20 @@ public final class ClassInitializerTranslator extends AbstractTranslator { } private void mayBeAddInitializerStatementForProperty(@NotNull JsParameter jsParameter, - @NotNull JetParameter jetParameter) { + @NotNull JetParameter jetParameter) { PropertyDescriptor propertyDescriptor = getPropertyDescriptorForConstructorParameter(bindingContext(), jetParameter); - if (propertyDescriptor != null) { - JsStatement assignmentToBackingFieldExpression = assignmentToBackingField - (context(), propertyDescriptor, jsParameter.getName().makeRef()).makeStmt(); + if (propertyDescriptor == null) { + return; + } + + final JsNameRef nameRef = jsParameter.getName().makeRef(); + if (context().isEcma5()) { + propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, context(), nameRef)); + } + else { + JsStatement assignmentToBackingFieldExpression = assignmentToBackingField(context(), propertyDescriptor, nameRef).makeStmt(); initializerStatements.add(assignmentToBackingFieldExpression); } } - - } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java new file mode 100644 index 00000000000..106a82eccf7 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010-2012 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.k2js.translate.initializer; + +import com.google.dart.compiler.backend.js.ast.JsExpression; +import com.google.dart.compiler.backend.js.ast.JsObjectLiteral; +import com.google.dart.compiler.backend.js.ast.JsStatement; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; +import org.jetbrains.jet.lang.psi.JetDeclaration; +import org.jetbrains.k2js.translate.context.TranslationContext; +import org.jetbrains.k2js.translate.utils.JsAstUtils; + +import java.util.List; + +final class InitializerEcma5Visitor extends InitializerVisitor { + private final JsObjectLiteral propertiesDefinition = new JsObjectLiteral(); + + @Nullable + @Override + protected JsExpression defineMember(TranslationContext context, PropertyDescriptor propertyDescriptor, JsExpression value) { + propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, context, value)); + return null; + } + + @Override + protected List createStatements(List declarations, TranslationContext context) { + List statements = super.createStatements(declarations, context); + if (!propertiesDefinition.getPropertyInitializers().isEmpty()) { + JsStatement statement = JsAstUtils.defineProperties(propertiesDefinition); + if (statements.isEmpty()) { + statements.add(statement); + } + else { + statements.add(0, statement); + } + } + return statements; + } +} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java index ab05b3209c7..94b4b88293d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java @@ -16,11 +16,9 @@ package org.jetbrains.k2js.translate.initializer; -import com.google.dart.compiler.backend.js.ast.JsExprStmt; -import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.backend.js.ast.JsInvocation; -import com.google.dart.compiler.backend.js.ast.JsStatement; +import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.*; @@ -36,6 +34,7 @@ import java.util.List; import static org.jetbrains.k2js.translate.general.Translation.translateAsStatement; import static org.jetbrains.k2js.translate.utils.BindingUtils.getDeclarationsForNamespace; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor; import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptorForObjectDeclaration; import static org.jetbrains.k2js.translate.utils.PsiUtils.getObjectDeclarationForName; import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; @@ -43,26 +42,25 @@ import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBa /** * @author Pavel Talanov */ -public final class InitializerVisitor extends TranslatorVisitor> { - - /*package*/ InitializerVisitor() { +class InitializerVisitor extends TranslatorVisitor> { + static InitializerVisitor create(TranslationContext context) { + return context.isEcma5() ? new InitializerEcma5Visitor() : new InitializerVisitor(); } @Override @NotNull - public List visitProperty(@NotNull JetProperty expression, @NotNull TranslationContext context) { - JetExpression initializer = expression.getInitializer(); + public final List visitProperty(@NotNull JetProperty property, @NotNull TranslationContext context) { + JetExpression initializer = property.getInitializer(); if (initializer == null) { - return new ArrayList(); + return Collections.emptyList(); } - return Arrays.asList(translateInitializer(expression, context, initializer)); + return toStatements(defineMember(context, getPropertyDescriptor(context.bindingContext(), property), + Translation.translateAsExpression(initializer, context))); } - @NotNull - private static JsStatement translateInitializer(@NotNull JetProperty property, @NotNull TranslationContext context, - @NotNull JetExpression initializer) { - JsExpression initExpression = Translation.translateAsExpression(initializer, context); - return assignmentToBackingField(context, property, initExpression).makeStmt(); + @Nullable + protected JsExpression defineMember(TranslationContext context, PropertyDescriptor propertyDescriptor, JsExpression value) { + return assignmentToBackingField(context, propertyDescriptor, value); } @Override @@ -81,32 +79,37 @@ public final class InitializerVisitor extends TranslatorVisitor visitObjectDeclarationName(@NotNull JetObjectDeclarationName objectName, - @NotNull TranslationContext context) { - PropertyDescriptor propertyDescriptorForObjectDeclaration - = getPropertyDescriptorForObjectDeclaration(context.bindingContext(), objectName); + public final List visitObjectDeclarationName(@NotNull JetObjectDeclarationName objectName, + @NotNull TranslationContext context) { + PropertyDescriptor propertyDescriptor = getPropertyDescriptorForObjectDeclaration(context.bindingContext(), objectName); JetObjectDeclaration objectDeclaration = getObjectDeclarationForName(objectName); JsInvocation objectValue = ClassTranslator.generateClassCreationExpression(objectDeclaration, context); - JsExprStmt assignment = assignmentToBackingField(context, propertyDescriptorForObjectDeclaration, objectValue) - .makeStmt(); - return Collections.singletonList(assignment); + return toStatements(defineMember(context, propertyDescriptor, objectValue)); + } + + private static List toStatements(@Nullable JsExpression expression) { + return expression == null ? Collections.emptyList() : Collections.singletonList(expression.makeStmt()); + } + + protected List createStatements(List declarations, TranslationContext context) { + if (declarations.isEmpty()) { + return Collections.emptyList(); + } + + List statements = new ArrayList(declarations.size()); + for (JetDeclaration declaration : declarations) { + statements.addAll(declaration.accept(this, context)); + } + return statements; } @NotNull - public List traverseClass(@NotNull JetClassOrObject expression, @NotNull TranslationContext context) { - List initializerStatements = new ArrayList(); - for (JetDeclaration declaration : expression.getDeclarations()) { - initializerStatements.addAll(declaration.accept(this, context)); - } - return initializerStatements; + public final List traverseClass(@NotNull JetClassOrObject expression, @NotNull TranslationContext context) { + return createStatements(expression.getDeclarations(), context); } @NotNull - public List traverseNamespace(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) { - List initializerStatements = new ArrayList(); - for (JetDeclaration declaration : getDeclarationsForNamespace(context.bindingContext(), namespace)) { - initializerStatements.addAll(declaration.accept(this, context)); - } - return initializerStatements; + public final List traverseNamespace(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) { + return createStatements(getDeclarationsForNamespace(context.bindingContext(), namespace), context); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java index 923cb522cce..d539718c14d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java @@ -46,11 +46,10 @@ public final class NamespaceInitializerTranslator { JsFunction result = JsAstUtils.createFunctionWithEmptyBody(namespaceContext.jsScope()); TranslationContext namespaceInitializerContext = namespaceContext.innerContextWithGivenScopeAndBlock(result.getScope(), result.getBody()); - List initializerStatements = - (new InitializerVisitor()).traverseNamespace(namespace, namespaceInitializerContext); + + List initializerStatements = (InitializerVisitor.create(namespaceContext)).traverseNamespace(namespace, + namespaceInitializerContext); result.getBody().getStatements().addAll(initializerStatements); return InitializerUtils.generateInitializeMethod(result); } - - -} +} \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index e3adc795fd5..798353c74de 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -24,9 +24,7 @@ import com.google.dart.compiler.backend.js.ast.JsNew; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.calls.ExpressionAsFunctionDescriptor; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.VariableAsFunctionResolvedCall; @@ -238,6 +236,17 @@ public final class CallTranslator extends AbstractTranslator { if (receiver != null) { setQualifier(callee, receiver); } + + if (context().isEcma5()) { + if (descriptor instanceof PropertyGetterDescriptor) { + return callee; + } + else if (descriptor instanceof PropertySetterDescriptor) { + assert arguments.size() == 1; + return assignment(callee, arguments.get(0)); + } + } + return newInvocation(callee, arguments); } }, context()); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/NativePropertyAccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/NativePropertyAccessTranslator.java index d0cafec5e4c..9e3ff6e7847 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/NativePropertyAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/NativePropertyAccessTranslator.java @@ -20,14 +20,13 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsName; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.utils.TranslationUtils; -import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getExpectedThisDescriptor; import static org.jetbrains.k2js.translate.utils.JsAstUtils.assignment; import static org.jetbrains.k2js.translate.utils.JsAstUtils.qualified; +import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getExpectedThisDescriptor; /** * @author Pavel Talanov @@ -73,7 +72,7 @@ public final class NativePropertyAccessTranslator extends PropertyAccessTranslat @NotNull protected JsExpression translateAsSet(@Nullable JsExpression receiver, @NotNull JsExpression setTo) { assert receiver != null; - return assignment(translateAsGet(getReceiver()), setTo); + return assignment(translateAsGet(receiver), setTo); } @NotNull @@ -83,7 +82,7 @@ public final class NativePropertyAccessTranslator extends PropertyAccessTranslat } @Nullable - public JsExpression getReceiver() { + private JsExpression getReceiver() { if (receiver != null) { return receiver; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index 3858c20f211..df7fedefdea 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -21,6 +21,7 @@ import com.google.dart.compiler.backend.js.ast.JsName; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.PropertyAccessorDescriptor; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.k2js.translate.context.TranslationContext; @@ -55,8 +56,14 @@ public final class ReferenceTranslator { @NotNull public static JsExpression translateAsLocalNameReference(@NotNull DeclarationDescriptor referencedDescriptor, @NotNull TranslationContext context) { - JsName referencedName = context.getNameForDescriptor(referencedDescriptor); - return referencedName.makeRef(); + DeclarationDescriptor effectiveDescriptor; + if (context.isEcma5() && referencedDescriptor instanceof PropertyAccessorDescriptor) { + effectiveDescriptor = ((PropertyAccessorDescriptor) referencedDescriptor).getCorrespondingProperty(); + } + else { + effectiveDescriptor = referencedDescriptor; + } + return context.getNameForDescriptor(effectiveDescriptor).makeRef(); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java index cd27a872d82..2e31f258059 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java @@ -20,6 +20,9 @@ import com.google.common.collect.Lists; import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; +import org.jetbrains.k2js.translate.context.TranslationContext; import java.util.*; @@ -27,6 +30,16 @@ import java.util.*; * @author Pavel Talanov */ public final class JsAstUtils { + private static final JsNameRef VALUE = new JsNameRef("value"); + private static final JsPropertyInitializer WRITABLE = new JsPropertyInitializer(new JsNameRef("writable"), null) ; + private static final JsNameRef DEFINE_PROPERTIES = new JsNameRef("defineProperties"); + private static final JsNameRef CREATE = new JsNameRef("create"); + + static { + JsNameRef nameRef = new JsNameRef("Object"); + DEFINE_PROPERTIES.setQualifier(nameRef); + CREATE.setQualifier(nameRef); + } private JsAstUtils() { } @@ -272,4 +285,38 @@ public final class JsAstUtils { } return result; } + + @NotNull + public static JsStatement defineProperties(JsObjectLiteral propertiesDefinition) { + JsInvocation invoke = new JsInvocation(); + invoke.setQualifier(DEFINE_PROPERTIES); + invoke.getArguments().add(new JsThisRef()); + invoke.getArguments().add(propertiesDefinition); + return invoke.makeStmt(); + } + + @NotNull + public static JsPropertyInitializer propertyDescriptor(PropertyDescriptor ktDescriptor, + TranslationContext context, + JsExpression value) { + return propertyDescriptor(ktDescriptor, context, value, ktDescriptor.isVar()); + } + + @NotNull + public static JsPropertyInitializer propertyDescriptor(DeclarationDescriptor ktDescriptor, + TranslationContext context, + JsExpression value, + boolean writable) { + JsObjectLiteral descriptor = new JsObjectLiteral(); + List meta = descriptor.getPropertyInitializers(); + meta.add(new JsPropertyInitializer(VALUE, value)); + if (writable) { + if (WRITABLE.getValueExpr() == null) { + WRITABLE.setValueExpr(context.program().getTrueLiteral()); + } + meta.add(WRITABLE); + } + // todo accessors + return new JsPropertyInitializer(context.getNameForDescriptor(ktDescriptor).makeRef(), descriptor); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index efdf8c9a8a5..c7a87419c46 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -33,10 +33,9 @@ import java.util.List; import static com.google.dart.compiler.util.AstUtil.newAssignment; import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getDeclarationDescriptorForReceiver; import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getExpectedReceiverDescriptor; -import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; /** * @author Pavel Talanov @@ -204,13 +203,6 @@ public final class TranslationUtils { return intrinsic.apply(left, Arrays.asList(right), context); } - @NotNull - public static JsExpression assignmentToBackingField(@NotNull TranslationContext context, @NotNull JetProperty property, - @NotNull JsExpression initExpression) { - PropertyDescriptor propertyDescriptor = getPropertyDescriptor(context.bindingContext(), property); - return assignmentToBackingField(context, propertyDescriptor, initExpression); - } - @Nullable public static JsExpression resolveThisObjectForResolvedCall(@NotNull ResolvedCall call, @NotNull TranslationContext context) { @@ -219,6 +211,6 @@ public final class TranslationUtils { return null; } DeclarationDescriptor expectedThisDescriptor = getDeclarationDescriptorForReceiver(thisObject); - return TranslationUtils.getThisObject(context, expectedThisDescriptor); + return getThisObject(context, expectedThisDescriptor); } } From b9b9e46275727b1647315ee3c7b05cd0e41d3984 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Tue, 15 May 2012 18:23:28 +0400 Subject: [PATCH 57/88] Clean up and stylistic changes after merging in https://github.com/JetBrains/kotlin/pull/55 --- .../jet/cli/common/CompilerVersion.java | 2 +- .../jet/plugin/compiler/K2JSCompiler.java | 6 +- .../k2js/translate/context/StaticContext.java | 21 ++++--- .../k2js/translate/general/Translation.java | 11 ++-- .../ClassInitializerTranslator.java | 12 ++-- .../initializer/Ecma3InitializerVisitor.java | 37 +++++++++++ ...itor.java => Ecma5InitializerVisitor.java} | 24 +++---- .../initializer/InitializerVisitor.java | 51 +++++++-------- .../translate/reference/CallTranslator.java | 45 +++++++++----- .../reference/ReferenceTranslator.java | 23 ++++--- .../k2js/translate/utils/JsAstUtils.java | 62 +++++++++---------- 11 files changed, 183 insertions(+), 111 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma3InitializerVisitor.java rename js/js.translator/src/org/jetbrains/k2js/translate/initializer/{InitializerEcma5Visitor.java => Ecma5InitializerVisitor.java} (69%) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java b/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java index 34d17bc7b94..98f1b3940e6 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java @@ -22,5 +22,5 @@ package org.jetbrains.jet.cli.common; public class CompilerVersion { // The value of this constant is generated by the build script // DON'T MODIFY IT - public static final String VERSION = "snapshot"; + public static final String VERSION = "@snapshot@"; } diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java index 4940a792401..bdb857fdc33 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java @@ -137,6 +137,11 @@ public final class K2JSCompiler implements TranslatingCompiler { ArrayList args = Lists.newArrayList("-tags", "-verbose", "-version"); addPathToSourcesDir(args, srcDir); addOutputPath(outFile, args); + addLibLocationAndTarget(project, args); + return ArrayUtil.toStringArray(args); + } + + private static void addLibLocationAndTarget(@NotNull Project project, @NotNull ArrayList args) { Pair data = JsModuleDetector.getLibLocationAndTargetForProject(project); if (data.first != null) { args.add("-libzip"); @@ -146,7 +151,6 @@ public final class K2JSCompiler implements TranslatingCompiler { args.add("-target"); args.add(data.second); } - return ArrayUtil.toStringArray(args); } private static void addPathToSourcesDir(@NotNull ArrayList args, @NotNull VirtualFile srcDir) { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index a1b50867982..71e855a39fb 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -45,14 +45,14 @@ import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.*; public final class StaticContext { public static StaticContext generateStaticContext(@NotNull JetStandardLibrary library, - @NotNull BindingContext bindingContext, Translation.EcmaVersion ecmaVersion) { + @NotNull BindingContext bindingContext, + @NotNull Translation.EcmaVersion ecmaVersion) { JsProgram program = new JsProgram("main"); JsRootScope jsRootScope = program.getRootScope(); Namer namer = Namer.newInstance(jsRootScope); NamingScope scope = NamingScope.rootScope(jsRootScope); Intrinsics intrinsics = Intrinsics.standardLibraryIntrinsics(library); - StandardClasses standardClasses = - StandardClasses.bindImplementations(namer.getKotlinScope()); + StandardClasses standardClasses = StandardClasses.bindImplementations(namer.getKotlinScope()); return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, scope, ecmaVersion); } @@ -170,7 +170,7 @@ public final class StaticContext { if (!(descriptor instanceof NamespaceDescriptor)) { return null; } - String nameForNamespace = getNameForNamespace((NamespaceDescriptor)descriptor); + String nameForNamespace = getNameForNamespace((NamespaceDescriptor) descriptor); return getRootScope().declareUnobfuscatableName(nameForNamespace); } }; @@ -200,7 +200,7 @@ public final class StaticContext { return null; } boolean isGetter = descriptor instanceof PropertyGetterDescriptor; - String propertyName = ((PropertyAccessorDescriptor)descriptor).getCorrespondingProperty().getName(); + String propertyName = ((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty().getName(); String accessorName = Namer.getNameForAccessor(propertyName, isGetter); NamingScope enclosingScope = getEnclosingScope(descriptor); return enclosingScope.declareObfuscatableName(accessorName); @@ -228,12 +228,13 @@ public final class StaticContext { return null; } + //TODO: move somewhere NamingScope enclosingScope = getEnclosingScope(descriptor); if (isEcma5()) { String name = descriptor.getName(); PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; if (!isDefaultAccessor(propertyDescriptor.getGetter()) || !isDefaultAccessor(propertyDescriptor.getSetter())) { - // _ is more preferable than $ — should be discussed later + // _ is more preferable than $ — should be discussed later name = '_' + name; } @@ -258,7 +259,7 @@ public final class StaticContext { if (!descriptor.getName().equals("toString")) { return null; } - if (((FunctionDescriptor)descriptor).getValueParameters().isEmpty()) { + if (((FunctionDescriptor) descriptor).getValueParameters().isEmpty()) { return getEnclosingScope(descriptor).declareUnobfuscatableName("toString"); } return null; @@ -272,7 +273,7 @@ public final class StaticContext { if (!(descriptor instanceof FunctionDescriptor)) { return null; } - FunctionDescriptor overriddenDescriptor = getOverriddenDescriptor((FunctionDescriptor)descriptor); + FunctionDescriptor overriddenDescriptor = getOverriddenDescriptor((FunctionDescriptor) descriptor); if (overriddenDescriptor == null) { return null; } @@ -307,7 +308,7 @@ public final class StaticContext { if (!(descriptor instanceof ClassDescriptor)) { return null; } - if (getSuperclass((ClassDescriptor)descriptor) == null) { + if (getSuperclass((ClassDescriptor) descriptor) == null) { return getRootScope().innerScope("Scope for class " + descriptor.getName()); } return null; @@ -319,7 +320,7 @@ public final class StaticContext { if (!(descriptor instanceof ClassDescriptor)) { return null; } - ClassDescriptor superclass = getSuperclass((ClassDescriptor)descriptor); + ClassDescriptor superclass = getSuperclass((ClassDescriptor) descriptor); if (superclass == null) { return null; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index a477c0deaea..1aeeeecaaba 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -27,8 +27,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.facade.exceptions.MainFunctionNotFoundException; -import org.jetbrains.k2js.facade.exceptions.TranslationInternalException; import org.jetbrains.k2js.facade.exceptions.TranslationException; +import org.jetbrains.k2js.facade.exceptions.TranslationInternalException; import org.jetbrains.k2js.facade.exceptions.UnsupportedFeatureException; import org.jetbrains.k2js.translate.context.StaticContext; import org.jetbrains.k2js.translate.context.TranslationContext; @@ -58,7 +58,7 @@ import static org.jetbrains.k2js.translate.utils.dangerous.DangerousData.collect * @author Pavel Talanov *

* This class provides a interface which all translators use to interact with each other. - * Goal is to simlify interaction between translators. + * Goal is to simplify interaction between translators. */ public final class Translation { public enum EcmaVersion { @@ -145,7 +145,9 @@ public final class Translation { @NotNull public static JsProgram generateAst(@NotNull BindingContext bindingContext, - @NotNull List files, @NotNull MainCallParameters mainCallParameters, EcmaVersion ecmaVersion) throws TranslationException { + @NotNull List files, @NotNull MainCallParameters mainCallParameters, + @NotNull EcmaVersion ecmaVersion) + throws TranslationException { try { return doGenerateAst(bindingContext, files, mainCallParameters, ecmaVersion); } @@ -159,7 +161,8 @@ public final class Translation { @NotNull private static JsProgram doGenerateAst(@NotNull BindingContext bindingContext, @NotNull List files, - @NotNull MainCallParameters mainCallParameters, EcmaVersion ecmaVersion) throws MainFunctionNotFoundException { + @NotNull MainCallParameters mainCallParameters, + @NotNull EcmaVersion ecmaVersion) throws MainFunctionNotFoundException { //TODO: move some of the code somewhere JetStandardLibrary standardLibrary = JetStandardLibrary.getInstance(); StaticContext staticContext = StaticContext.generateStaticContext(standardLibrary, bindingContext, ecmaVersion); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java index c2ef7b08644..4786f384376 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java @@ -48,7 +48,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator { private final JetClassOrObject classDeclaration; @NotNull private final List initializerStatements = new ArrayList(); - + @NotNull private final JsObjectLiteral propertiesDefinition = new JsObjectLiteral(); public ClassInitializerTranslator(@NotNull JetClassOrObject classDeclaration, @NotNull TranslationContext context) { @@ -135,13 +135,17 @@ public final class ClassInitializerTranslator extends AbstractTranslator { if (propertyDescriptor == null) { return; } + JsNameRef initialValueForProperty = jsParameter.getName().makeRef(); + addInitializerOrPropertyDefinition(initialValueForProperty, propertyDescriptor); + } - final JsNameRef nameRef = jsParameter.getName().makeRef(); + private void addInitializerOrPropertyDefinition(@NotNull JsNameRef initialValue, @NotNull PropertyDescriptor propertyDescriptor) { if (context().isEcma5()) { - propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, context(), nameRef)); + propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, initialValue, context())); } else { - JsStatement assignmentToBackingFieldExpression = assignmentToBackingField(context(), propertyDescriptor, nameRef).makeStmt(); + JsStatement assignmentToBackingFieldExpression = + assignmentToBackingField(context(), propertyDescriptor, initialValue).makeStmt(); initializerStatements.add(assignmentToBackingFieldExpression); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma3InitializerVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma3InitializerVisitor.java new file mode 100644 index 00000000000..7645f4943fe --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma3InitializerVisitor.java @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2012 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.k2js.translate.initializer; + +import com.google.dart.compiler.backend.js.ast.JsExpression; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; +import org.jetbrains.k2js.translate.context.TranslationContext; + +import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; + +/** + * @author Pavel Talanov + */ +public final class Ecma3InitializerVisitor extends InitializerVisitor { + @Override + @Nullable + protected JsExpression generateInitializerForProperty(@NotNull PropertyDescriptor propertyDescriptor, + @NotNull JsExpression value, @NotNull TranslationContext context) { + return assignmentToBackingField(context, propertyDescriptor, value); + } +} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma5InitializerVisitor.java similarity index 69% rename from js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java rename to js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma5InitializerVisitor.java index 106a82eccf7..3378f81baf8 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma5InitializerVisitor.java @@ -19,6 +19,7 @@ package org.jetbrains.k2js.translate.initializer; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsObjectLiteral; import com.google.dart.compiler.backend.js.ast.JsStatement; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.JetDeclaration; @@ -27,27 +28,26 @@ import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.List; -final class InitializerEcma5Visitor extends InitializerVisitor { +public final class Ecma5InitializerVisitor extends InitializerVisitor { + @NotNull private final JsObjectLiteral propertiesDefinition = new JsObjectLiteral(); - @Nullable @Override - protected JsExpression defineMember(TranslationContext context, PropertyDescriptor propertyDescriptor, JsExpression value) { - propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, context, value)); + @Nullable + protected JsExpression generateInitializerForProperty(@NotNull PropertyDescriptor propertyDescriptor, + @NotNull JsExpression value, @NotNull TranslationContext context) { + propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, value, context)); return null; } + @NotNull @Override - protected List createStatements(List declarations, TranslationContext context) { - List statements = super.createStatements(declarations, context); + protected List generateInitializerStatements(@NotNull List declarations, + @NotNull TranslationContext context) { + List statements = super.generateInitializerStatements(declarations, context); if (!propertiesDefinition.getPropertyInitializers().isEmpty()) { JsStatement statement = JsAstUtils.defineProperties(propertiesDefinition); - if (statements.isEmpty()) { - statements.add(statement); - } - else { - statements.add(0, statement); - } + statements.add(0, statement); } return statements; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java index 94b4b88293d..302802d84d2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java @@ -16,7 +16,10 @@ package org.jetbrains.k2js.translate.initializer; -import com.google.dart.compiler.backend.js.ast.*; +import com.google.common.collect.Lists; +import com.google.dart.compiler.backend.js.ast.JsExpression; +import com.google.dart.compiler.backend.js.ast.JsInvocation; +import com.google.dart.compiler.backend.js.ast.JsStatement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; @@ -26,25 +29,22 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.declaration.ClassTranslator; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.TranslatorVisitor; +import org.jetbrains.k2js.translate.utils.JsAstUtils; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.jetbrains.k2js.translate.general.Translation.translateAsStatement; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getDeclarationsForNamespace; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptorForObjectDeclaration; +import static org.jetbrains.k2js.translate.utils.BindingUtils.*; import static org.jetbrains.k2js.translate.utils.PsiUtils.getObjectDeclarationForName; -import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; /** * @author Pavel Talanov */ -class InitializerVisitor extends TranslatorVisitor> { +public abstract class InitializerVisitor extends TranslatorVisitor> { static InitializerVisitor create(TranslationContext context) { - return context.isEcma5() ? new InitializerEcma5Visitor() : new InitializerVisitor(); + return context.isEcma5() ? new Ecma5InitializerVisitor() : new Ecma3InitializerVisitor(); } @Override @@ -54,19 +54,21 @@ class InitializerVisitor extends TranslatorVisitor> { if (initializer == null) { return Collections.emptyList(); } - return toStatements(defineMember(context, getPropertyDescriptor(context.bindingContext(), property), - Translation.translateAsExpression(initializer, context))); + JsExpression initalizerForProperty = generateInitializerForProperty(getPropertyDescriptor(context.bindingContext(), property), + Translation.translateAsExpression(initializer, context), + context); + return JsAstUtils.nullableExpressionToStatementList(initalizerForProperty); } + //TODO: should return JsStatement? @Nullable - protected JsExpression defineMember(TranslationContext context, PropertyDescriptor propertyDescriptor, JsExpression value) { - return assignmentToBackingField(context, propertyDescriptor, value); - } + protected abstract JsExpression generateInitializerForProperty(@NotNull PropertyDescriptor descriptor, + @NotNull JsExpression expression, @NotNull TranslationContext context); @Override @NotNull public List visitAnonymousInitializer(@NotNull JetClassInitializer initializer, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { return Arrays.asList(translateAsStatement(initializer.getBody(), context)); } @@ -84,19 +86,14 @@ class InitializerVisitor extends TranslatorVisitor> { PropertyDescriptor propertyDescriptor = getPropertyDescriptorForObjectDeclaration(context.bindingContext(), objectName); JetObjectDeclaration objectDeclaration = getObjectDeclarationForName(objectName); JsInvocation objectValue = ClassTranslator.generateClassCreationExpression(objectDeclaration, context); - return toStatements(defineMember(context, propertyDescriptor, objectValue)); + JsExpression initializerForProperty = generateInitializerForProperty(propertyDescriptor, objectValue, context); + return JsAstUtils.nullableExpressionToStatementList(initializerForProperty); } - private static List toStatements(@Nullable JsExpression expression) { - return expression == null ? Collections.emptyList() : Collections.singletonList(expression.makeStmt()); - } - - protected List createStatements(List declarations, TranslationContext context) { - if (declarations.isEmpty()) { - return Collections.emptyList(); - } - - List statements = new ArrayList(declarations.size()); + @NotNull + protected List generateInitializerStatements(@NotNull List declarations, + @NotNull TranslationContext context) { + List statements = Lists.newArrayList(); for (JetDeclaration declaration : declarations) { statements.addAll(declaration.accept(this, context)); } @@ -105,11 +102,11 @@ class InitializerVisitor extends TranslatorVisitor> { @NotNull public final List traverseClass(@NotNull JetClassOrObject expression, @NotNull TranslationContext context) { - return createStatements(expression.getDeclarations(), context); + return generateInitializerStatements(expression.getDeclarations(), context); } @NotNull public final List traverseNamespace(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) { - return createStatements(getDeclarationsForNamespace(context.bindingContext(), namespace), context); + return generateInitializerStatements(getDeclarationsForNamespace(context.bindingContext(), namespace), context); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index 798353c74de..c5f58227b2f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -232,26 +232,43 @@ public final class CallTranslator extends AbstractTranslator { @NotNull @Override public JsExpression construct(@Nullable JsExpression receiver) { - JsExpression callee = callParameters.getFunctionReference(); - if (receiver != null) { - setQualifier(callee, receiver); + JsExpression qualifiedCallee = getQualifiedCallee(receiver); + + if (isEcma5PropertyAccess()) { + return ecma5PropertyAccess(qualifiedCallee); } - if (context().isEcma5()) { - if (descriptor instanceof PropertyGetterDescriptor) { - return callee; - } - else if (descriptor instanceof PropertySetterDescriptor) { - assert arguments.size() == 1; - return assignment(callee, arguments.get(0)); - } - } - - return newInvocation(callee, arguments); + return newInvocation(qualifiedCallee, arguments); } }, context()); } + @NotNull + private JsExpression ecma5PropertyAccess(@NotNull JsExpression callee) { + if (descriptor instanceof PropertyGetterDescriptor) { + assert arguments.isEmpty(); + return callee; + } + else { + assert descriptor instanceof PropertySetterDescriptor; + assert arguments.size() == 1; + return assignment(callee, arguments.get(0)); + } + } + + private boolean isEcma5PropertyAccess() { + return context().isEcma5() && descriptor instanceof PropertyAccessorDescriptor; + } + + @NotNull + private JsExpression getQualifiedCallee(@Nullable JsExpression receiver) { + JsExpression callee = callParameters.getFunctionReference(); + if (receiver != null) { + setQualifier(callee, receiver); + } + return callee; + } + @Nullable private JsExpression getThisObjectOrQualifier() { JsExpression thisObject = callParameters.getThisObject(); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index df7fedefdea..bf4e7d43830 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -38,13 +38,13 @@ public final class ReferenceTranslator { @NotNull public static JsExpression translateSimpleName(@NotNull JetSimpleNameExpression expression, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { return getAccessTranslator(expression, context).translateAsGet(); } @NotNull public static JsExpression translateAsFQReference(@NotNull DeclarationDescriptor referencedDescriptor, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { JsExpression qualifier = context.getQualifierForDescriptor(referencedDescriptor); if (qualifier == null) { return translateAsLocalNameReference(referencedDescriptor, context); @@ -55,7 +55,16 @@ public final class ReferenceTranslator { @NotNull public static JsExpression translateAsLocalNameReference(@NotNull DeclarationDescriptor referencedDescriptor, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { + DeclarationDescriptor effectiveDescriptor = getReferencedDescriptor(referencedDescriptor, context); + return context.getNameForDescriptor(effectiveDescriptor).makeRef(); + } + + + //TODO: should not be doing this + @NotNull + private static DeclarationDescriptor getReferencedDescriptor(@NotNull DeclarationDescriptor referencedDescriptor, + @NotNull TranslationContext context) { DeclarationDescriptor effectiveDescriptor; if (context.isEcma5() && referencedDescriptor instanceof PropertyAccessorDescriptor) { effectiveDescriptor = ((PropertyAccessorDescriptor) referencedDescriptor).getCorrespondingProperty(); @@ -63,19 +72,19 @@ public final class ReferenceTranslator { else { effectiveDescriptor = referencedDescriptor; } - return context.getNameForDescriptor(effectiveDescriptor).makeRef(); + return effectiveDescriptor; } @NotNull public static AccessTranslator getAccessTranslator(@NotNull JetSimpleNameExpression referenceExpression, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { return getAccessTranslator(referenceExpression, null, context); } @NotNull public static AccessTranslator getAccessTranslator(@NotNull JetSimpleNameExpression referenceExpression, - @Nullable JsExpression receiver, - @NotNull TranslationContext context) { + @Nullable JsExpression receiver, + @NotNull TranslationContext context) { if (isBackingFieldReference(referenceExpression)) { return BackingFieldAccessTranslator.newInstance(referenceExpression, context); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java index 2e31f258059..fe59022b93c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java @@ -18,9 +18,9 @@ package org.jetbrains.k2js.translate.utils; import com.google.common.collect.Lists; import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.k2js.translate.context.TranslationContext; @@ -31,14 +31,14 @@ import java.util.*; */ public final class JsAstUtils { private static final JsNameRef VALUE = new JsNameRef("value"); - private static final JsPropertyInitializer WRITABLE = new JsPropertyInitializer(new JsNameRef("writable"), null) ; + private static final JsPropertyInitializer WRITABLE = new JsPropertyInitializer(new JsNameRef("writable"), null); private static final JsNameRef DEFINE_PROPERTIES = new JsNameRef("defineProperties"); private static final JsNameRef CREATE = new JsNameRef("create"); static { - JsNameRef nameRef = new JsNameRef("Object"); - DEFINE_PROPERTIES.setQualifier(nameRef); - CREATE.setQualifier(nameRef); + JsNameRef globalObjectReference = new JsNameRef("Object"); + DEFINE_PROPERTIES.setQualifier(globalObjectReference); + CREATE.setQualifier(globalObjectReference); } private JsAstUtils() { @@ -287,36 +287,36 @@ public final class JsAstUtils { } @NotNull - public static JsStatement defineProperties(JsObjectLiteral propertiesDefinition) { - JsInvocation invoke = new JsInvocation(); - invoke.setQualifier(DEFINE_PROPERTIES); - invoke.getArguments().add(new JsThisRef()); - invoke.getArguments().add(propertiesDefinition); - return invoke.makeStmt(); + public static JsStatement defineProperties(@NotNull JsObjectLiteral propertiesDefinition) { + return AstUtil.newInvocation(DEFINE_PROPERTIES, new JsThisRef(), propertiesDefinition).makeStmt(); } @NotNull - public static JsPropertyInitializer propertyDescriptor(PropertyDescriptor ktDescriptor, - TranslationContext context, - JsExpression value) { - return propertyDescriptor(ktDescriptor, context, value, ktDescriptor.isVar()); - } - - @NotNull - public static JsPropertyInitializer propertyDescriptor(DeclarationDescriptor ktDescriptor, - TranslationContext context, - JsExpression value, - boolean writable) { - JsObjectLiteral descriptor = new JsObjectLiteral(); - List meta = descriptor.getPropertyInitializers(); + public static JsPropertyInitializer propertyDescriptor(@NotNull PropertyDescriptor descriptor, + @NotNull JsExpression value, @NotNull TranslationContext context) { + JsObjectLiteral jsPropertyDescriptor = new JsObjectLiteral(); + List meta = jsPropertyDescriptor.getPropertyInitializers(); meta.add(new JsPropertyInitializer(VALUE, value)); - if (writable) { - if (WRITABLE.getValueExpr() == null) { - WRITABLE.setValueExpr(context.program().getTrueLiteral()); - } - meta.add(WRITABLE); + if (descriptor.isVar()) { + meta.add(getWritable(context)); } - // todo accessors - return new JsPropertyInitializer(context.getNameForDescriptor(ktDescriptor).makeRef(), descriptor); + // TODO: accessors + return new JsPropertyInitializer(context.getNameForDescriptor(descriptor).makeRef(), jsPropertyDescriptor); + } + + @NotNull + private static JsPropertyInitializer getWritable(@NotNull TranslationContext context) { + if (WRITABLE.getValueExpr() == null) { + WRITABLE.setValueExpr(context.program().getTrueLiteral()); + } + return WRITABLE; + } + + @NotNull + public static List nullableExpressionToStatementList(@Nullable JsExpression initalizerForProperty) { + if (initalizerForProperty == null) { + return Collections.emptyList(); + } + return Collections.singletonList(initalizerForProperty.makeStmt()); } } From b75b60f71004760428b72c61b06ad5c418f03658 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Tue, 15 May 2012 18:32:53 +0400 Subject: [PATCH 58/88] Move EcmaVersion class to upper level Extract EcmaVersion#fromString static method --- .../src/org/jetbrains/k2js/config/Config.java | 33 +++++++++---------- .../jetbrains/k2js/config/EcmaVersion.java | 33 +++++++++++++++++++ .../k2js/translate/context/StaticContext.java | 10 +++--- .../k2js/translate/general/Translation.java | 4 +-- 4 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java diff --git a/js/js.translator/src/org/jetbrains/k2js/config/Config.java b/js/js.translator/src/org/jetbrains/k2js/config/Config.java index f5bf2dcae15..e95611740a3 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/Config.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/Config.java @@ -17,7 +17,6 @@ package org.jetbrains.k2js.config; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; @@ -26,8 +25,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import static org.jetbrains.k2js.translate.general.Translation.EcmaVersion; - /** * @author Pavel Talanov *

@@ -48,20 +45,20 @@ public abstract class Config { @NotNull protected static final List LIB_FILE_NAMES = Arrays.asList( - "/core/annotations.kt", - "/jquery/common.kt", - "/jquery/ui.kt", - "/core/javautil.kt", - "/core/javalang.kt", - "/core/date.kt", - "/core/core.kt", - "/core/math.kt", - "/core/json.kt", - "/raphael/raphael.kt", - "/html5/canvas.kt", - "/html5/files.kt", - "/html5/image.kt", - "/stdlib/JUMaps.kt" + "/core/annotations.kt", + "/jquery/common.kt", + "/jquery/ui.kt", + "/core/javautil.kt", + "/core/javalang.kt", + "/core/date.kt", + "/core/core.kt", + "/core/math.kt", + "/core/json.kt", + "/raphael/raphael.kt", + "/html5/canvas.kt", + "/html5/files.kt", + "/html5/image.kt", + "/stdlib/JUMaps.kt" ); protected static final String LIBRARIES_LOCATION = "js/js.libraries/src"; @@ -75,7 +72,7 @@ public abstract class Config { public Config(@NotNull Project project, @Nullable String target) { this.project = project; - this.target = StringUtil.compareVersionNumbers(target, "5") >= 0 ? EcmaVersion.v5 : EcmaVersion.v3; + this.target = EcmaVersion.fromString(target); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java b/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java new file mode 100644 index 00000000000..38217ec8935 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2012 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.k2js.config; + +import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Pavel Talanov + */ +public enum EcmaVersion { + v3, v5; + + @NotNull + static EcmaVersion fromString(@Nullable String target) { + return StringUtil.compareVersionNumbers(target, "5") >= 0 ? v5 : v3; + } +} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index 71e855a39fb..f68fb0b1e74 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -24,9 +24,9 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.translate.context.generator.Generator; import org.jetbrains.k2js.translate.context.generator.Rule; -import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; import org.jetbrains.k2js.translate.utils.AnnotationsUtils; import org.jetbrains.k2js.translate.utils.JsAstUtils; @@ -46,7 +46,7 @@ public final class StaticContext { public static StaticContext generateStaticContext(@NotNull JetStandardLibrary library, @NotNull BindingContext bindingContext, - @NotNull Translation.EcmaVersion ecmaVersion) { + @NotNull EcmaVersion ecmaVersion) { JsProgram program = new JsProgram("main"); JsRootScope jsRootScope = program.getRootScope(); Namer namer = Namer.newInstance(jsRootScope); @@ -85,12 +85,12 @@ public final class StaticContext { private final Map scopeToFunction = Maps.newHashMap(); @NotNull - private final Translation.EcmaVersion ecmaVersion; + private final EcmaVersion ecmaVersion; //TODO: too many parameters in constructor private StaticContext(@NotNull JsProgram program, @NotNull BindingContext bindingContext, @NotNull Namer namer, @NotNull Intrinsics intrinsics, - @NotNull StandardClasses standardClasses, @NotNull NamingScope rootScope, @NotNull Translation.EcmaVersion ecmaVersion) { + @NotNull StandardClasses standardClasses, @NotNull NamingScope rootScope, @NotNull EcmaVersion ecmaVersion) { this.program = program; this.bindingContext = bindingContext; this.namer = namer; @@ -101,7 +101,7 @@ public final class StaticContext { } public boolean isEcma5() { - return ecmaVersion == Translation.EcmaVersion.v5; + return ecmaVersion == EcmaVersion.v5; } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index 1aeeeecaaba..65abfa1a6a9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.facade.exceptions.MainFunctionNotFoundException; import org.jetbrains.k2js.facade.exceptions.TranslationException; @@ -61,9 +62,6 @@ import static org.jetbrains.k2js.translate.utils.dangerous.DangerousData.collect * Goal is to simplify interaction between translators. */ public final class Translation { - public enum EcmaVersion { - v3, v5 - } private Translation() { } From a9af4960cb48a5959b6b2a5975c7762e7ca209e4 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Tue, 15 May 2012 18:39:43 +0400 Subject: [PATCH 59/88] Introduce some convenience methods related to EcmaVersion --- .../cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java | 6 +++--- idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java | 4 ++-- .../test/org/jetbrains/k2js/test/config/TestConfig.java | 4 ++-- js/js.translator/src/org/jetbrains/k2js/config/Config.java | 6 +++--- .../src/org/jetbrains/k2js/config/EcmaVersion.java | 7 ++++++- .../jetbrains/k2js/config/ZippedLibrarySourcesConfig.java | 4 ++-- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java index ec756937b4a..6f69093b3dd 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java @@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS; import org.jetbrains.k2js.config.Config; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.config.ZippedLibrarySourcesConfig; import org.jetbrains.k2js.facade.K2JSTranslator; @@ -93,8 +94,7 @@ public class K2JSCompiler extends CLICompiler jsLibFiles = null; public TestConfig(@NotNull Project project) { - super(project, null); + super(project, EcmaVersion.v3); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/config/Config.java b/js/js.translator/src/org/jetbrains/k2js/config/Config.java index e95611740a3..fafa190127a 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/Config.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/Config.java @@ -34,7 +34,7 @@ public abstract class Config { @NotNull public static Config getEmptyConfig(@NotNull Project project, @Nullable String target) { - return new Config(project, target) { + return new Config(project, EcmaVersion.fromString(target)) { @NotNull @Override protected List generateLibFiles() { @@ -70,9 +70,9 @@ public abstract class Config { @NotNull private final EcmaVersion target; - public Config(@NotNull Project project, @Nullable String target) { + public Config(@NotNull Project project, @NotNull EcmaVersion ecmaVersion) { this.project = project; - this.target = EcmaVersion.fromString(target); + this.target = ecmaVersion; } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java b/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java index 38217ec8935..b17fc2acde7 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java @@ -27,7 +27,12 @@ public enum EcmaVersion { v3, v5; @NotNull - static EcmaVersion fromString(@Nullable String target) { + public static EcmaVersion fromString(@Nullable String target) { return StringUtil.compareVersionNumbers(target, "5") >= 0 ? v5 : v3; } + + @NotNull + public static EcmaVersion defaultVersion() { + return v3; + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/config/ZippedLibrarySourcesConfig.java b/js/js.translator/src/org/jetbrains/k2js/config/ZippedLibrarySourcesConfig.java index d873252e882..83ac136dc4f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/ZippedLibrarySourcesConfig.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/ZippedLibrarySourcesConfig.java @@ -40,8 +40,8 @@ public class ZippedLibrarySourcesConfig extends Config { @Nullable protected final String pathToLibZip; - public ZippedLibrarySourcesConfig(@NotNull Project project, @Nullable String pathToZip, @Nullable String target) { - super(project, target); + public ZippedLibrarySourcesConfig(@NotNull Project project, @Nullable String pathToZip, @NotNull EcmaVersion ecmaVersion) { + super(project, ecmaVersion); pathToLibZip = pathToZip; } From 3bab6bee93c436d60179b0eb47d9b0a4ebafcfd8 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Tue, 15 May 2012 19:33:04 +0400 Subject: [PATCH 60/88] Make tests aware of different ecma versions Introduce version parameters in relevant test methods --- .../org/jetbrains/k2js/test/BasicTest.java | 33 +++++++++++++++++-- .../test/MultipleFilesTranslationTest.java | 10 +++--- .../k2js/test/SingleFileTranslationTest.java | 33 +++++++++++-------- .../k2js/test/semantics/InlineTest.java | 3 +- .../k2js/test/utils/JsTestUtils.java | 10 ++++-- .../k2js/test/utils/TranslationUtils.java | 9 ++--- .../jetbrains/k2js/config/EcmaVersion.java | 7 ++++ 7 files changed, 77 insertions(+), 28 deletions(-) diff --git a/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java b/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java index d0efbc59e82..c59798dbabc 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java @@ -20,9 +20,13 @@ import com.google.common.collect.Lists; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetTestUtils; +import org.jetbrains.k2js.config.EcmaVersion; +import org.jetbrains.k2js.facade.MainCallParameters; +import org.jetbrains.k2js.test.utils.TranslationUtils; import java.io.File; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import static org.jetbrains.k2js.test.utils.JsTestUtils.convertFileNameToDotJsFile; @@ -84,6 +88,22 @@ public abstract class BasicTest extends TestWithEnvironment { return Collections.singletonList(KOTLIN_JS_LIB); } + protected void generateJavaScriptFiles(@NotNull String kotlinFilename, + @NotNull MainCallParameters mainCallParameters, + @NotNull EnumSet ecmaVersions) throws Exception { + generateJavaScriptFiles(Collections.singletonList(getInputFilePath(kotlinFilename)), kotlinFilename, mainCallParameters, + ecmaVersions); + } + + protected void generateJavaScriptFiles(@NotNull List files, @NotNull String testName, + @NotNull MainCallParameters mainCallParameters, @NotNull EnumSet ecmaVersions) + throws Exception { + for (EcmaVersion version : ecmaVersions) { + TranslationUtils.translateFiles(getProject(), files, getOutputFilePath(testName, version), mainCallParameters, version); + } + } + + protected static String casesDirectoryName() { return CASES; } @@ -129,8 +149,17 @@ public abstract class BasicTest extends TestWithEnvironment { } @NotNull - protected String getOutputFilePath(@NotNull String filename) { - return getOutputPath() + convertFileNameToDotJsFile(filename); + protected List getOutputFilePaths(@NotNull String filename, @NotNull EnumSet ecmaVersions) { + List result = Lists.newArrayList(); + for (EcmaVersion ecmaVersion : ecmaVersions) { + result.add(getOutputFilePath(filename, ecmaVersion)); + } + return result; + } + + @NotNull + protected String getOutputFilePath(@NotNull String filename, @NotNull EcmaVersion ecmaVersion) { + return getOutputPath() + convertFileNameToDotJsFile(filename, ecmaVersion); } @NotNull diff --git a/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java b/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java index 70b6ba4d6a1..2fd8c67b395 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java @@ -17,14 +17,12 @@ package org.jetbrains.k2js.test; import org.jetbrains.annotations.NotNull; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.MainCallParameters; -import org.jetbrains.k2js.test.rhino.RhinoFunctionResultChecker; import java.util.List; -import static org.jetbrains.k2js.test.rhino.RhinoUtils.runRhinoTest; import static org.jetbrains.k2js.test.utils.JsTestUtils.getAllFilesInDir; -import static org.jetbrains.k2js.test.utils.TranslationUtils.translateFiles; /** * @author Pavel Talanov @@ -37,14 +35,14 @@ public abstract class MultipleFilesTranslationTest extends BasicTest { protected void generateJsFromDir(@NotNull String dirName) throws Exception { List fullFilePaths = getAllFilesInDir(getInputFilePath(dirName)); - translateFiles(getProject(), fullFilePaths, getOutputFilePath(dirName + ".kt"), MainCallParameters.noCall()); + generateJavaScriptFiles(fullFilePaths, dirName, MainCallParameters.noCall(), EcmaVersion.all()); } protected void runMultiFileTest(@NotNull String dirName, @NotNull String namespaceName, @NotNull String functionName, @NotNull Object expectedResult) throws Exception { generateJsFromDir(dirName); - runRhinoTest(withAdditionalFiles(getOutputFilePath(dirName + ".kt")), - new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); + //runRhinoTest(withAdditionalFiles(getOutputFilePaths(dirName + ".kt", EcmaVersion.all())), + // new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); } public void checkFooBoxIsTrue(@NotNull String dirName) throws Exception { diff --git a/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java b/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java index 599ef455565..4d5a53e00ef 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java @@ -18,10 +18,13 @@ package org.jetbrains.k2js.test; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.test.rhino.RhinoFunctionResultChecker; import org.jetbrains.k2js.test.rhino.RhinoSystemOutputChecker; -import org.jetbrains.k2js.test.utils.TranslationUtils; + +import java.util.EnumSet; +import java.util.List; import static org.jetbrains.k2js.test.rhino.RhinoUtils.runRhinoTest; import static org.jetbrains.k2js.test.utils.JsTestUtils.readFile; @@ -36,15 +39,15 @@ public abstract class SingleFileTranslationTest extends BasicTest { super(main); } - public void runFunctionOutputTest(String filename, String namespaceName, + public void runFunctionOutputTest(String kotlinFilename, String namespaceName, String functionName, Object expectedResult) throws Exception { - generateJsFromFile(filename, MainCallParameters.noCall()); - runRhinoTest(withAdditionalFiles(getOutputFilePath(filename)), - new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); - } - - protected void generateJsFromFile(@NotNull String filename, @NotNull MainCallParameters mainCallParameters) throws Exception { - TranslationUtils.translateFile(getProject(), getInputFilePath(filename), getOutputFilePath(filename), mainCallParameters); + EnumSet ecmaVersions = EcmaVersion.all(); + generateJavaScriptFiles(kotlinFilename, MainCallParameters.noCall(), ecmaVersions); + List outputFilePaths = getOutputFilePaths(kotlinFilename, ecmaVersions); + for (String outputFilePath : outputFilePaths) { + runRhinoTest(withAdditionalFiles(outputFilePath), + new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); + } } public void checkFooBoxIsTrue(@NotNull String filename) throws Exception { @@ -59,10 +62,14 @@ public abstract class SingleFileTranslationTest extends BasicTest { runFunctionOutputTest(filename, "foo", "box", "OK"); } - protected void checkOutput(@NotNull String filename, @NotNull String expectedResult, @NotNull String... args) throws Exception { - generateJsFromFile(filename, MainCallParameters.mainWithArguments(Lists.newArrayList(args))); - runRhinoTest(withAdditionalFiles(getOutputFilePath(filename)), - new RhinoSystemOutputChecker(expectedResult)); + protected void checkOutput(@NotNull String kotlinFilename, @NotNull String expectedResult, @NotNull String... args) throws Exception { + EnumSet ecmaVersions = EcmaVersion.all(); + generateJavaScriptFiles(kotlinFilename, MainCallParameters.mainWithArguments(Lists.newArrayList(args)), ecmaVersions); + List outputFilePaths = getOutputFilePaths(kotlinFilename, ecmaVersions); + for (String outputFilePath : outputFilePaths) { + runRhinoTest(withAdditionalFiles(outputFilePath), + new RhinoSystemOutputChecker(expectedResult)); + } } protected void performTestWithMain(@NotNull String testName, @NotNull String testId, @NotNull String... args) throws Exception { diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/InlineTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/InlineTest.java index 7f808428247..85705c2da0e 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/InlineTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/InlineTest.java @@ -18,6 +18,7 @@ package org.jetbrains.k2js.test.semantics; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.test.SingleFileTranslationTest; import java.io.File; @@ -68,7 +69,7 @@ public final class InlineTest extends SingleFileTranslationTest { private void checkFooBoxIsTrueAndFunctionNameIsNotReferenced(@NotNull String filename, String funName) throws Exception { fooBoxTest(); - String generatedJSFilePath = getOutputFilePath(filename); + String generatedJSFilePath = getOutputFilePath(filename, EcmaVersion.defaultVersion()); String outputFileText = FileUtil.loadFile(new File(generatedJSFilePath)); assertTrue(countOccurrences(outputFileText, funName) == 1); } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java b/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java index 3065d749389..fdbca4eb642 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java @@ -18,6 +18,7 @@ package org.jetbrains.k2js.test.utils; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.k2js.config.EcmaVersion; import java.io.File; import java.io.FileInputStream; @@ -33,8 +34,13 @@ public final class JsTestUtils { private JsTestUtils() { } - public static String convertFileNameToDotJsFile(@NotNull String filename) { - return filename.substring(0, filename.lastIndexOf('.')) + ".js"; + public static String convertFileNameToDotJsFile(@NotNull String filename, EcmaVersion ecmaVersion) { + String postFix = "_" + ecmaVersion.toString() + ".js"; + int index = filename.lastIndexOf('.'); + if (index < 0) { + return filename + postFix; + } + return filename.substring(0, index) + postFix; } @NotNull diff --git a/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java b/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java index 13a2ecfc5fb..8c34792fd46 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.K2JSTranslator; import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.generate.CodeGenerator; @@ -45,13 +46,13 @@ public final class TranslationUtils { private static /*var*/ K2JSTranslator translator = null; public static void translateFile(@NotNull Project project, @NotNull String inputFile, - @NotNull String outputFile, @NotNull MainCallParameters mainCallParameters) throws Exception { - translateFiles(project, Collections.singletonList(inputFile), outputFile, mainCallParameters); + @NotNull String outputFile, @NotNull MainCallParameters mainCallParameters, @NotNull EcmaVersion version) throws Exception { + translateFiles(project, Collections.singletonList(inputFile), outputFile, mainCallParameters, version); } public static void translateFiles(@NotNull Project project, @NotNull List inputFiles, - @NotNull String outputFile, @NotNull MainCallParameters mainCallParameters) throws Exception { - + @NotNull String outputFile, @NotNull MainCallParameters mainCallParameters, @NotNull EcmaVersion version) throws Exception { + //TODO: ignoring version for the moment List psiFiles = createPsiFileList(inputFiles, project); JsProgram program = getTranslator(project).generateProgram(psiFiles, mainCallParameters); FileWriter writer = new FileWriter(new File(outputFile)); diff --git a/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java b/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java index b17fc2acde7..ffc346459ba 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/EcmaVersion.java @@ -20,6 +20,8 @@ import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.EnumSet; + /** * @author Pavel Talanov */ @@ -35,4 +37,9 @@ public enum EcmaVersion { public static EcmaVersion defaultVersion() { return v3; } + + @NotNull + public static EnumSet all() { + return EnumSet.allOf(EcmaVersion.class); + } } From 43c168baef90c1f710719b594e23019d9f3c6ec7 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Tue, 15 May 2012 19:51:13 +0400 Subject: [PATCH 61/88] Make js.tests perform each test with different Ecma versions This leads to tests failing --- .../org/jetbrains/k2js/test/BasicTest.java | 8 ++++++++ .../test/MultipleFilesTranslationTest.java | 5 +++-- .../k2js/test/SingleFileTranslationTest.java | 19 +++++-------------- .../k2js/test/config/TestConfig.java | 4 ++-- .../k2js/test/utils/TranslationUtils.java | 16 +++++++++------- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java b/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java index c59798dbabc..b20a4673a29 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.MainCallParameters; +import org.jetbrains.k2js.test.rhino.RhinoResultChecker; import org.jetbrains.k2js.test.utils.TranslationUtils; import java.io.File; @@ -29,6 +30,7 @@ import java.util.Collections; import java.util.EnumSet; import java.util.List; +import static org.jetbrains.k2js.test.rhino.RhinoUtils.runRhinoTest; import static org.jetbrains.k2js.test.utils.JsTestUtils.convertFileNameToDotJsFile; /** @@ -103,6 +105,12 @@ public abstract class BasicTest extends TestWithEnvironment { } } + protected void runRhinoTests(@NotNull List outputFilePaths, @NotNull RhinoResultChecker checker) throws Exception { + for (String outputFilePath : outputFilePaths) { + runRhinoTest(withAdditionalFiles(outputFilePath), checker); + } + } + protected static String casesDirectoryName() { return CASES; diff --git a/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java b/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java index 2fd8c67b395..172c29cd5b7 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java @@ -19,6 +19,7 @@ package org.jetbrains.k2js.test; import org.jetbrains.annotations.NotNull; import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.MainCallParameters; +import org.jetbrains.k2js.test.rhino.RhinoFunctionResultChecker; import java.util.List; @@ -41,8 +42,8 @@ public abstract class MultipleFilesTranslationTest extends BasicTest { protected void runMultiFileTest(@NotNull String dirName, @NotNull String namespaceName, @NotNull String functionName, @NotNull Object expectedResult) throws Exception { generateJsFromDir(dirName); - //runRhinoTest(withAdditionalFiles(getOutputFilePaths(dirName + ".kt", EcmaVersion.all())), - // new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); + runRhinoTests(getOutputFilePaths(dirName + ".kt", EcmaVersion.all()), + new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); } public void checkFooBoxIsTrue(@NotNull String dirName) throws Exception { diff --git a/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java b/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java index 4d5a53e00ef..9af0b7034ce 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java @@ -24,9 +24,7 @@ import org.jetbrains.k2js.test.rhino.RhinoFunctionResultChecker; import org.jetbrains.k2js.test.rhino.RhinoSystemOutputChecker; import java.util.EnumSet; -import java.util.List; -import static org.jetbrains.k2js.test.rhino.RhinoUtils.runRhinoTest; import static org.jetbrains.k2js.test.utils.JsTestUtils.readFile; /** @@ -39,15 +37,12 @@ public abstract class SingleFileTranslationTest extends BasicTest { super(main); } - public void runFunctionOutputTest(String kotlinFilename, String namespaceName, - String functionName, Object expectedResult) throws Exception { + public void runFunctionOutputTest(@NotNull String kotlinFilename, @NotNull String namespaceName, + @NotNull String functionName, @NotNull Object expectedResult) throws Exception { EnumSet ecmaVersions = EcmaVersion.all(); generateJavaScriptFiles(kotlinFilename, MainCallParameters.noCall(), ecmaVersions); - List outputFilePaths = getOutputFilePaths(kotlinFilename, ecmaVersions); - for (String outputFilePath : outputFilePaths) { - runRhinoTest(withAdditionalFiles(outputFilePath), - new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); - } + runRhinoTests(getOutputFilePaths(kotlinFilename, ecmaVersions), + new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); } public void checkFooBoxIsTrue(@NotNull String filename) throws Exception { @@ -65,11 +60,7 @@ public abstract class SingleFileTranslationTest extends BasicTest { protected void checkOutput(@NotNull String kotlinFilename, @NotNull String expectedResult, @NotNull String... args) throws Exception { EnumSet ecmaVersions = EcmaVersion.all(); generateJavaScriptFiles(kotlinFilename, MainCallParameters.mainWithArguments(Lists.newArrayList(args)), ecmaVersions); - List outputFilePaths = getOutputFilePaths(kotlinFilename, ecmaVersions); - for (String outputFilePath : outputFilePaths) { - runRhinoTest(withAdditionalFiles(outputFilePath), - new RhinoSystemOutputChecker(expectedResult)); - } + runRhinoTests(getOutputFilePaths(kotlinFilename, ecmaVersions), new RhinoSystemOutputChecker(expectedResult)); } protected void performTestWithMain(@NotNull String testName, @NotNull String testId, @NotNull String... args) throws Exception { diff --git a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java index c35a63c3ac6..b71bfed31b9 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java @@ -40,8 +40,8 @@ public final class TestConfig extends Config { @Nullable private /*var*/ List jsLibFiles = null; - public TestConfig(@NotNull Project project) { - super(project, EcmaVersion.v3); + public TestConfig(@NotNull Project project, @NotNull EcmaVersion version) { + super(project, version); } @NotNull diff --git a/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java b/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java index 8c34792fd46..76c88714074 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java @@ -16,10 +16,10 @@ package org.jetbrains.k2js.test.utils; +import closurecompiler.internal.com.google.common.collect.Maps; import com.google.dart.compiler.backend.js.ast.JsProgram; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.K2JSTranslator; @@ -31,6 +31,7 @@ import java.io.File; import java.io.FileWriter; import java.util.Collections; import java.util.List; +import java.util.Map; import static org.jetbrains.k2js.utils.JetFileUtils.createPsiFileList; @@ -42,8 +43,8 @@ public final class TranslationUtils { private TranslationUtils() { } - @Nullable - private static /*var*/ K2JSTranslator translator = null; + @NotNull + private static final Map translators = Maps.newHashMap(); public static void translateFile(@NotNull Project project, @NotNull String inputFile, @NotNull String outputFile, @NotNull MainCallParameters mainCallParameters, @NotNull EcmaVersion version) throws Exception { @@ -52,9 +53,8 @@ public final class TranslationUtils { public static void translateFiles(@NotNull Project project, @NotNull List inputFiles, @NotNull String outputFile, @NotNull MainCallParameters mainCallParameters, @NotNull EcmaVersion version) throws Exception { - //TODO: ignoring version for the moment List psiFiles = createPsiFileList(inputFiles, project); - JsProgram program = getTranslator(project).generateProgram(psiFiles, mainCallParameters); + JsProgram program = getTranslator(project, version).generateProgram(psiFiles, mainCallParameters); FileWriter writer = new FileWriter(new File(outputFile)); try { writer.write("\"use strict\";\n"); @@ -66,9 +66,11 @@ public final class TranslationUtils { } @NotNull - private static K2JSTranslator getTranslator(@NotNull Project project) { + private static K2JSTranslator getTranslator(@NotNull Project project, @NotNull EcmaVersion version) { + K2JSTranslator translator = translators.get(version); if (translator == null) { - translator = new K2JSTranslator(new TestConfig(project)); + translators.put(version, translator); + translator = new K2JSTranslator(new TestConfig(project, version)); } return translator; } From 6d414ba2221f4d6067557bda22ec3df3258d902e Mon Sep 17 00:00:00 2001 From: pTalanov Date: Tue, 15 May 2012 20:25:44 +0400 Subject: [PATCH 62/88] Mark the tests which are failing with EcmaVersion.v5 and exclude them --- .../test/MultipleFilesTranslationTest.java | 17 +++++-- .../k2js/test/SingleFileTranslationTest.java | 49 +++++++++++++++---- .../k2js/test/semantics/ExamplesTest.java | 23 +++++---- .../test/semantics/ExtensionPropertyTest.java | 8 +-- .../k2js/test/semantics/MiscTest.java | 27 +++++----- .../k2js/test/semantics/NamespaceTest.java | 9 ++-- .../test/semantics/NativeInteropTest.java | 3 +- .../semantics/OperatorOverloadingTest.java | 4 +- .../test/semantics/PropertyAccessTest.java | 9 ++-- .../k2js/test/semantics/RangeTest.java | 6 ++- .../k2js/test/semantics/SimpleTest.java | 22 +++++---- .../test/semantics/StandardClassesTest.java | 14 +++--- .../test/semantics/WebDemoExamples2Test.java | 8 +-- .../k2js/test/utils/JsTestUtils.java | 18 +++++++ 14 files changed, 148 insertions(+), 69 deletions(-) diff --git a/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java b/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java index 172c29cd5b7..81c8b7225e8 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/MultipleFilesTranslationTest.java @@ -21,6 +21,7 @@ import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.test.rhino.RhinoFunctionResultChecker; +import java.util.EnumSet; import java.util.List; import static org.jetbrains.k2js.test.utils.JsTestUtils.getAllFilesInDir; @@ -34,15 +35,23 @@ public abstract class MultipleFilesTranslationTest extends BasicTest { super(main); } - protected void generateJsFromDir(@NotNull String dirName) throws Exception { + protected void generateJsFromDir(@NotNull String dirName, @NotNull EnumSet ecmaVersions) throws Exception { List fullFilePaths = getAllFilesInDir(getInputFilePath(dirName)); - generateJavaScriptFiles(fullFilePaths, dirName, MainCallParameters.noCall(), EcmaVersion.all()); + generateJavaScriptFiles(fullFilePaths, dirName, MainCallParameters.noCall(), ecmaVersions); } protected void runMultiFileTest(@NotNull String dirName, @NotNull String namespaceName, @NotNull String functionName, @NotNull Object expectedResult) throws Exception { - generateJsFromDir(dirName); - runRhinoTests(getOutputFilePaths(dirName + ".kt", EcmaVersion.all()), + runMultiFileTests(EcmaVersion.all(), dirName, namespaceName, functionName, expectedResult); + } + + protected void runMultiFileTests(@NotNull EnumSet ecmaVersions, @NotNull String dirName, + @NotNull String namespaceName, + @NotNull String functionName, + @NotNull Object expectedResult) + throws Exception { + generateJsFromDir(dirName, ecmaVersions); + runRhinoTests(getOutputFilePaths(dirName + ".kt", ecmaVersions), new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java b/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java index 9af0b7034ce..da0572c0ec3 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/SingleFileTranslationTest.java @@ -39,31 +39,60 @@ public abstract class SingleFileTranslationTest extends BasicTest { public void runFunctionOutputTest(@NotNull String kotlinFilename, @NotNull String namespaceName, @NotNull String functionName, @NotNull Object expectedResult) throws Exception { - EnumSet ecmaVersions = EcmaVersion.all(); + runFunctionOutputTest(EcmaVersion.all(), kotlinFilename, namespaceName, functionName, expectedResult); + } + + protected void runFunctionOutputTest(@NotNull EnumSet ecmaVersions, @NotNull String kotlinFilename, + @NotNull String namespaceName, + @NotNull String functionName, + @NotNull Object expectedResult) throws Exception { generateJavaScriptFiles(kotlinFilename, MainCallParameters.noCall(), ecmaVersions); runRhinoTests(getOutputFilePaths(kotlinFilename, ecmaVersions), new RhinoFunctionResultChecker(namespaceName, functionName, expectedResult)); } - public void checkFooBoxIsTrue(@NotNull String filename) throws Exception { - runFunctionOutputTest(filename, "foo", "box", true); + public void checkFooBoxIsTrue(@NotNull String filename, @NotNull EnumSet ecmaVersions) throws Exception { + runFunctionOutputTest(ecmaVersions, filename, "foo", "box", true); } - public void fooBoxTest() throws Exception { - checkFooBoxIsTrue(getTestName(true) + ".kt"); + protected void fooBoxTest() throws Exception { + checkFooBoxIsTrue(getTestName(true) + ".kt", EcmaVersion.all()); } - public void checkFooBoxIsOk(@NotNull String filename) throws Exception { - runFunctionOutputTest(filename, "foo", "box", "OK"); + protected void fooBoxTest(@NotNull EnumSet ecmaVersions) throws Exception { + checkFooBoxIsTrue(getTestName(true) + ".kt", ecmaVersions); } - protected void checkOutput(@NotNull String kotlinFilename, @NotNull String expectedResult, @NotNull String... args) throws Exception { - EnumSet ecmaVersions = EcmaVersion.all(); + protected void checkFooBoxIsOk(@NotNull String filename) throws Exception { + checkFooBoxIsOk(EcmaVersion.all(), filename); + } + + protected void checkFooBoxIsOk(@NotNull EnumSet versions, @NotNull String filename) throws Exception { + runFunctionOutputTest(versions, filename, "foo", "box", "OK"); + } + + protected void checkOutput(@NotNull String kotlinFilename, + @NotNull String expectedResult, + @NotNull String... args) throws Exception { + checkOutput(kotlinFilename, expectedResult, EcmaVersion.all(), args); + } + + protected void checkOutput(@NotNull String kotlinFilename, + @NotNull String expectedResult, + @NotNull EnumSet ecmaVersions, + String... args) throws Exception { generateJavaScriptFiles(kotlinFilename, MainCallParameters.mainWithArguments(Lists.newArrayList(args)), ecmaVersions); runRhinoTests(getOutputFilePaths(kotlinFilename, ecmaVersions), new RhinoSystemOutputChecker(expectedResult)); } + protected void performTestWithMain(@NotNull EnumSet ecmaVersions, + @NotNull String testName, + @NotNull String testId, + @NotNull String... args) throws Exception { + checkOutput(testName + ".kt", readFile(expected(testName + testId)), ecmaVersions, args); + } + protected void performTestWithMain(@NotNull String testName, @NotNull String testId, @NotNull String... args) throws Exception { - checkOutput(testName + ".kt", readFile(expected(testName + testId)), args); + performTestWithMain(EcmaVersion.all(), testName, testId, args); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExamplesTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExamplesTest.java index 944ccc6f766..de4d049dd61 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExamplesTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExamplesTest.java @@ -22,6 +22,8 @@ import org.jetbrains.k2js.test.BasicTest; import org.jetbrains.k2js.test.SingleFileTranslationTest; import org.jetbrains.k2js.translate.context.Namer; +import static org.jetbrains.k2js.test.utils.JsTestUtils.failsOnEcmaV5; + @SuppressWarnings("JUnitTestCaseWithNoTests") public final class ExamplesTest extends SingleFileTranslationTest { @@ -36,18 +38,19 @@ public final class ExamplesTest extends SingleFileTranslationTest { @Override public void runTest() throws Exception { - runFunctionOutputTest(filename, Namer.getRootNamespaceName(), "box", "OK"); + runFunctionOutputTest(failsOnEcmaV5(), filename, Namer.getRootNamespaceName(), "box", "OK"); } public static Test suite() throws Exception { - return TranslatorTestCaseBuilder.suiteForDirectory(BasicTest.pathToTestFilesRoot() + "examples/cases/", new TranslatorTestCaseBuilder.NamedTestFactory() { - @NotNull - @Override - public Test createTest(@NotNull String filename) { - ExamplesTest examplesTest = new ExamplesTest(filename); - examplesTest.setName(filename); - return examplesTest; - } - }); + return TranslatorTestCaseBuilder + .suiteForDirectory(BasicTest.pathToTestFilesRoot() + "examples/cases/", new TranslatorTestCaseBuilder.NamedTestFactory() { + @NotNull + @Override + public Test createTest(@NotNull String filename) { + ExamplesTest examplesTest = new ExamplesTest(filename); + examplesTest.setName(filename); + return examplesTest; + } + }); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExtensionPropertyTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExtensionPropertyTest.java index 29588d3eea5..eb8ebb19e16 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExtensionPropertyTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExtensionPropertyTest.java @@ -18,6 +18,8 @@ package org.jetbrains.k2js.test.semantics; import org.jetbrains.k2js.test.SingleFileTranslationTest; +import static org.jetbrains.k2js.test.utils.JsTestUtils.failsOnEcmaV5; + /** * @author Pavel Talanov */ @@ -28,14 +30,14 @@ public final class ExtensionPropertyTest extends SingleFileTranslationTest { } public void testSimplePropertyWithGetter() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } public void testPropertyWithGetterAndSetter() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } public void testAbsExtension() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java index 1fa25a13f89..3c13428bd20 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java @@ -16,9 +16,12 @@ package org.jetbrains.k2js.test.semantics; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.translate.context.Namer; import org.mozilla.javascript.JavaScriptException; +import static org.jetbrains.k2js.test.utils.JsTestUtils.failsOnEcmaV5; + /** * @author Pavel Talanov *

@@ -36,7 +39,7 @@ public final class MiscTest extends AbstractExpressionTest { } public void testIntRange() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } @@ -45,7 +48,7 @@ public final class MiscTest extends AbstractExpressionTest { } public void testClassWithoutNamespace() throws Exception { - runFunctionOutputTest("classWithoutNamespace.kt", Namer.getRootNamespaceName(), "box", true); + runFunctionOutputTest(failsOnEcmaV5(), "classWithoutNamespace.kt", Namer.getRootNamespaceName(), "box", true); } public void testIfElseAsExpressionWithThrow() throws Exception { @@ -58,7 +61,7 @@ public final class MiscTest extends AbstractExpressionTest { } public void testKt1052_2() throws Exception { - checkFooBoxIsTrue("KT-1052-2.kt"); + checkFooBoxIsTrue("KT-1052-2.kt", EcmaVersion.all()); } public void testKt1052() throws Exception { @@ -67,27 +70,27 @@ public final class MiscTest extends AbstractExpressionTest { public void testKt740_1() throws Exception { - checkFooBoxIsTrue("KT-740.kt"); + checkFooBoxIsTrue("KT-740.kt", EcmaVersion.all()); } public void testKt740_2() throws Exception { - checkFooBoxIsOk("KT-740-2.kt"); + checkFooBoxIsOk(failsOnEcmaV5(), "KT-740-2.kt"); } public void testKt1361_1() throws Exception { - checkFooBoxIsTrue("KT-1361-1.kt"); + checkFooBoxIsTrue("KT-1361-1.kt", EcmaVersion.all()); } public void testKt1361_2() throws Exception { - checkFooBoxIsTrue("KT-1361-2.kt"); + checkFooBoxIsTrue("KT-1361-2.kt", EcmaVersion.all()); } public void testKt817() throws Exception { - checkFooBoxIsTrue("KT-817.kt"); + checkFooBoxIsTrue("KT-817.kt", EcmaVersion.all()); } public void testKt740_3() throws Exception { - checkFooBoxIsOk("KT-740-3.kt"); + checkFooBoxIsOk(failsOnEcmaV5(), "KT-740-3.kt"); } public void testFunInConstructor() throws Exception { @@ -107,11 +110,11 @@ public final class MiscTest extends AbstractExpressionTest { } public void testExtensionLiteralCreatedAtNamespaceLevel() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } public void testTemporaryVariableCreatedInNamespaceInitializer() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } public void testWhenReturnedWithoutBlock() throws Exception { @@ -127,7 +130,7 @@ public final class MiscTest extends AbstractExpressionTest { } public void testKt1865() throws Exception { - checkFooBoxIsTrue("KT-1865.kt"); + checkFooBoxIsTrue("KT-1865.kt", EcmaVersion.all()); } public void testMainFunInNestedNamespace() throws Exception { diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NamespaceTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NamespaceTest.java index 1686fe1fa2a..15932fa4c4c 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NamespaceTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NamespaceTest.java @@ -35,14 +35,17 @@ public final class NamespaceTest extends SingleFileTranslationTest { } public void testDeeplyNestedNamespaceFunctionCalled() throws Exception { - runFunctionOutputTest("deeplyNestedNamespaceFunctionCalled.kt", "foo1.foo2.foo3.foo5.foo6.foo7.foo8", "box", true); + runFunctionOutputTest("deeplyNestedNamespaceFunctionCalled.kt", "foo1.foo2.foo3.foo5.foo6.foo7.foo8", "box", true + ); } public void testClassCreatedInDeeplyNestedNamespace() throws Exception { - runFunctionOutputTest("classCreatedInDeeplyNestedNamespace.kt", "foo1.foo2.foo3.foo5.foo6.foo7.foo8", "box", true); + runFunctionOutputTest("classCreatedInDeeplyNestedNamespace.kt", "foo1.foo2.foo3.foo5.foo6.foo7.foo8", "box", true + ); } public void testInitializersOfNestedNamespacesExecute() throws Exception { - runFunctionOutputTest("initializersOfNestedNamespacesExecute.kt", "foo1.foo2.foo3.foo5.foo6.foo7.foo8", "box", true); + runFunctionOutputTest("initializersOfNestedNamespacesExecute.kt", "foo1.foo2.foo3.foo5.foo6.foo7.foo8", "box", true + ); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java index c85eae2ed83..874b23b206a 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java @@ -18,6 +18,7 @@ package org.jetbrains.k2js.test.semantics; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.test.SingleFileTranslationTest; import org.jetbrains.k2js.test.utils.JsTestUtils; @@ -59,6 +60,6 @@ public final class NativeInteropTest extends SingleFileTranslationTest { } public void testKt1519() throws Exception { - checkFooBoxIsTrue("KT-1519.kt"); + checkFooBoxIsTrue("KT-1519.kt", EcmaVersion.all()); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/OperatorOverloadingTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/OperatorOverloadingTest.java index 9b2a0c962b0..d23b2b51044 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/OperatorOverloadingTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/OperatorOverloadingTest.java @@ -18,6 +18,8 @@ package org.jetbrains.k2js.test.semantics; import org.jetbrains.k2js.test.SingleFileTranslationTest; +import static org.jetbrains.k2js.test.utils.JsTestUtils.failsOnEcmaV5; + /** * @author Pavel Talanov */ @@ -58,7 +60,7 @@ public final class OperatorOverloadingTest extends SingleFileTranslationTest { public void testOperatorOverloadOnPropertyCallGetterAndSetterOnlyOnce() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyAccessTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyAccessTest.java index 7bad8bd9f53..388a70c7a83 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyAccessTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyAccessTest.java @@ -18,6 +18,8 @@ package org.jetbrains.k2js.test.semantics; import org.jetbrains.k2js.test.SingleFileTranslationTest; +import static org.jetbrains.k2js.test.utils.JsTestUtils.failsOnEcmaV5; + /** * @author Pavel Talanov */ @@ -43,12 +45,12 @@ public final class PropertyAccessTest extends SingleFileTranslationTest { public void testCustomGetter() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } public void testCustomSetter() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } public void testNamespacePropertyInitializer() throws Exception { @@ -61,7 +63,7 @@ public final class PropertyAccessTest extends SingleFileTranslationTest { } public void testNamespaceCustomAccessors() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } @@ -72,5 +74,4 @@ public final class PropertyAccessTest extends SingleFileTranslationTest { public void testExtensionLiteralSafeCall() throws Exception { fooBoxTest(); } - } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/RangeTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/RangeTest.java index 10a497e40a9..23bbd0a6938 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/RangeTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/RangeTest.java @@ -18,6 +18,8 @@ package org.jetbrains.k2js.test.semantics; import org.jetbrains.k2js.test.SingleFileTranslationTest; +import static org.jetbrains.k2js.test.utils.JsTestUtils.failsOnEcmaV5; + /** * @author Pavel Talanov */ @@ -28,12 +30,12 @@ public final class RangeTest extends SingleFileTranslationTest { } public void testExplicitRange() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } public void testRangeSugarSyntax() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/SimpleTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/SimpleTest.java index 99134a4d7e2..aac8760f744 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/SimpleTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/SimpleTest.java @@ -18,6 +18,7 @@ package org.jetbrains.k2js.test.semantics; import junit.framework.Test; import org.jetbrains.annotations.NotNull; +import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.test.BasicTest; import org.jetbrains.k2js.test.SingleFileTranslationTest; @@ -38,18 +39,19 @@ public final class SimpleTest extends SingleFileTranslationTest { @Override public void runTest() throws Exception { - checkFooBoxIsTrue(filename); + checkFooBoxIsTrue(filename, EcmaVersion.all()); } public static Test suite() throws Exception { - return TranslatorTestCaseBuilder.suiteForDirectory(BasicTest.pathToTestFilesRoot() + "simple/cases/", new TranslatorTestCaseBuilder.NamedTestFactory() { - @NotNull - @Override - public Test createTest(@NotNull String filename) { - SimpleTest examplesTest = new SimpleTest(filename); - examplesTest.setName(filename); - return examplesTest; - } - }); + return TranslatorTestCaseBuilder + .suiteForDirectory(BasicTest.pathToTestFilesRoot() + "simple/cases/", new TranslatorTestCaseBuilder.NamedTestFactory() { + @NotNull + @Override + public Test createTest(@NotNull String filename) { + SimpleTest examplesTest = new SimpleTest(filename); + examplesTest.setName(filename); + return examplesTest; + } + }); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StandardClassesTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StandardClassesTest.java index 8a02744a4ac..0bf924d4c6f 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StandardClassesTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StandardClassesTest.java @@ -18,6 +18,8 @@ package org.jetbrains.k2js.test.semantics; import org.jetbrains.k2js.test.SingleFileTranslationTest; +import static org.jetbrains.k2js.test.utils.JsTestUtils.failsOnEcmaV5; + /** * @author Pavel Talanov */ @@ -43,7 +45,7 @@ public final class StandardClassesTest extends SingleFileTranslationTest { public void testArrayFunctionConstructor() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } @@ -53,13 +55,13 @@ public final class StandardClassesTest extends SingleFileTranslationTest { //TODO: this feature in not supported for some time //TODO: support it. Probably configurable. -// (expected = JavaScriptException.class) -// public void arrayThrowsExceptionOnOOBaccess() throws Exception { -// fooBoxTest(); -// } + // (expected = JavaScriptException.class) + // public void arrayThrowsExceptionOnOOBaccess() throws Exception { + // fooBoxTest(); + // } public void testArraysIterator() throws Exception { - fooBoxTest(); + fooBoxTest(failsOnEcmaV5()); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/WebDemoExamples2Test.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/WebDemoExamples2Test.java index 28afb839d55..739b5e1dc8a 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/WebDemoExamples2Test.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/WebDemoExamples2Test.java @@ -18,6 +18,8 @@ package org.jetbrains.k2js.test.semantics; import org.jetbrains.k2js.test.SingleFileTranslationTest; +import static org.jetbrains.k2js.test.utils.JsTestUtils.failsOnEcmaV5; + /** * @author Pavel Talanov */ @@ -33,11 +35,11 @@ public final class WebDemoExamples2Test extends SingleFileTranslationTest { } public void testLife() throws Exception { - performTestWithMain("life", "", "2"); + performTestWithMain(failsOnEcmaV5(), "life", "", "2"); } public void testBuilder() throws Exception { - performTestWithMain("builder", ""); - performTestWithMain("builder", "1", "over9000"); + performTestWithMain(failsOnEcmaV5(), "builder", ""); + performTestWithMain(failsOnEcmaV5(), "builder", "1", "over9000"); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java b/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java index fdbca4eb642..2229ea0eb3e 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java @@ -24,6 +24,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; /** @@ -34,6 +35,23 @@ public final class JsTestUtils { private JsTestUtils() { } + @NotNull + public static EnumSet failsOn(EcmaVersion... versions) { + EnumSet result = EcmaVersion.all(); + for (EcmaVersion version : versions) { + boolean success = result.remove(version); + assert success; + } + return result; + } + + @NotNull + public static EnumSet failsOnEcmaV5() { + return failsOn(EcmaVersion.v5); + } + + + @NotNull public static String convertFileNameToDotJsFile(@NotNull String filename, EcmaVersion ecmaVersion) { String postFix = "_" + ecmaVersion.toString() + ".js"; int index = filename.lastIndexOf('.'); From 67b19c188183fd11d8c176f0fea77dfff435d5dd Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Tue, 15 May 2012 22:45:11 +0400 Subject: [PATCH 63/88] fix generate.javadoc property --- build.xml | 72 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/build.xml b/build.xml index c18e71c4903..62c1b6ff598 100644 --- a/build.xml +++ b/build.xml @@ -91,44 +91,50 @@ - - - - - - - - - - - + + + - - + + + + + + + + + + + - - - - - + + - - - - + + + + + - - + + + + - - - - - + + + + + + + + + + From 448260fc3e0161e2aaa873fa2000568ce5f0e72e Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Tue, 15 May 2012 22:45:11 +0400 Subject: [PATCH 64/88] KT-1996 Missing ABSTRACT_MEMBER_NOT_IMPLEMENTED when two supertypes contains same abstract member === trait Foo { fun foo(): Unit } trait Bar { fun foo(): Unit } class Baz : Foo, Bar // no error here === #KT-1996 fixed --- .../jetbrains/jet/lang/resolve/OverrideResolver.java | 5 +++++ ...MultipleDefaultsInSupertypesNoExplicitOverride.jet | 4 ++-- .../override/ToAbstractMembersFromSuper-kt1996.jet | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/override/ToAbstractMembersFromSuper-kt1996.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index d3008c4364e..7c8ec96c3a2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -307,14 +307,19 @@ public class OverrideResolver { else { List nonAbstractManyImpl = Lists.newArrayList(); Set filteredOverriddenDeclarations = OverridingUtil.filterOverrides(Sets.newHashSet(overriddenDeclarations)); + boolean allSuperAbstract = true; for (CallableMemberDescriptor overridden : filteredOverriddenDeclarations) { if (overridden.getModality() != Modality.ABSTRACT) { nonAbstractManyImpl.add(overridden); + allSuperAbstract = false; } } if (nonAbstractManyImpl.size() > 1) { manyImpl.addAll(nonAbstractManyImpl); } + else if (allSuperAbstract) { + abstractNoImpl.addAll(overriddenDeclarations); + } } } } diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.jet b/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.jet index ab30bf1408e..3973a6e311e 100644 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.jet +++ b/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.jet @@ -6,5 +6,5 @@ trait Y { fun foo(a : Int = 1) } -class Z1 : X, Y {} // BUG -object Z1O : X, Y {} // BUG +class Z1 : X, Y {} // BUG +object Z1O : X, Y {} // BUG diff --git a/compiler/testData/diagnostics/tests/override/ToAbstractMembersFromSuper-kt1996.jet b/compiler/testData/diagnostics/tests/override/ToAbstractMembersFromSuper-kt1996.jet new file mode 100644 index 00000000000..80789f796af --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/ToAbstractMembersFromSuper-kt1996.jet @@ -0,0 +1,11 @@ +// http://youtrack.jetbrains.com/issue/KT-1996 + +trait Foo { + fun foo(): Unit +} + +trait Bar { + fun foo(): Unit +} + +class Baz : Foo, Bar From 67589e9d863279de01eeca2481cea99dc8ee7f20 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Tue, 15 May 2012 22:45:11 +0400 Subject: [PATCH 65/88] simplify code in OverrideResolver --- .../org/jetbrains/jet/lang/resolve/OverrideResolver.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 7c8ec96c3a2..d81599fdb3b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -298,12 +298,6 @@ public class OverrideResolver { if (overriddenDeclarations.size() == 0) { throw new IllegalStateException("A 'fake override' must override something"); } - else if (overriddenDeclarations.size() == 1) { - CallableMemberDescriptor single = overriddenDeclarations.iterator().next(); - if (single.getModality() == Modality.ABSTRACT) { - abstractNoImpl.add(single); - } - } else { List nonAbstractManyImpl = Lists.newArrayList(); Set filteredOverriddenDeclarations = OverridingUtil.filterOverrides(Sets.newHashSet(overriddenDeclarations)); From 82426e605d7e44cf305fd056bf05f5ce4060e1ce Mon Sep 17 00:00:00 2001 From: pTalanov Date: Tue, 15 May 2012 22:47:39 +0400 Subject: [PATCH 66/88] Fix symbol in comments --- .../src/org/jetbrains/k2js/translate/context/StaticContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index f68fb0b1e74..4344c01b7c5 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -234,7 +234,7 @@ public final class StaticContext { String name = descriptor.getName(); PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; if (!isDefaultAccessor(propertyDescriptor.getGetter()) || !isDefaultAccessor(propertyDescriptor.getSetter())) { - // _ is more preferable than $ — should be discussed later + // _ is more preferable than $ should be discussed later name = '_' + name; } From 58a3ec1e73b14a13432e30f9de23327fa287adbf Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 16 May 2012 13:24:21 +0400 Subject: [PATCH 67/88] Showing receiver types in the IDE errors for NONE_APPLICABLE/AMBIGUITY #KT-1997 fixed --- .../jet/plugin/highlighter/IdeErrorMessages.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index f8efd55141e..302aa81790b 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.ResolvedCallImpl; import org.jetbrains.jet.lang.resolve.calls.ResolvedValueArgument; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.resolve.DescriptorRenderer; @@ -190,9 +191,12 @@ public class IdeErrorMessages { CallableDescriptor funDescriptor = call.getResultingDescriptor(); Set parametersToHighlight = getParametersToHighlight(call); + DescriptorRenderer htmlRenderer = DescriptorRenderer.HTML; + if (funDescriptor.getReceiverParameter() != ReceiverDescriptor.NO_RECEIVER) { + stringBuilder.append(htmlRenderer.renderType(funDescriptor.getReceiverParameter().getType())).append("."); + } stringBuilder.append(funDescriptor.getName()).append("("); boolean first = true; - DescriptorRenderer htmlRend = DescriptorRenderer.HTML; for (ValueParameterDescriptor parameter : funDescriptor.getValueParameters()) { if (!first) { stringBuilder.append(", "); @@ -202,7 +206,7 @@ public class IdeErrorMessages { if (varargElementType != null) { type = varargElementType; } - String paramString = (varargElementType != null ? "vararg " : "") + htmlRend.renderType(type); + String paramString = (varargElementType != null ? "vararg " : "") + htmlRenderer.renderType(type); if (parameter.hasDefaultValue()) { paramString += " = ..."; } @@ -214,7 +218,7 @@ public class IdeErrorMessages { first = false; } stringBuilder.append(parametersToHighlight.contains(null) ? String.format(RED_TEMPLATE, ")") : ")"); - stringBuilder.append(" ").append(htmlRend.renderMessage("defined in")).append(" "); + stringBuilder.append(" ").append(htmlRenderer.renderMessage("defined in")).append(" "); DeclarationDescriptor containingDeclaration = funDescriptor.getContainingDeclaration(); if (containingDeclaration != null) { FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration); From fe0295c7bbfdae1d0b8033a80cd9934e6e0c5bf9 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Wed, 16 May 2012 14:24:03 +0400 Subject: [PATCH 68/88] Add facade method to AnalyzingFacadeForJs (for Web Demo) --- .../jetbrains/k2js/analyze/AnalyzerFacadeForJS.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java index 7886c6818a0..65471f76b97 100644 --- a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java +++ b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java @@ -58,9 +58,17 @@ public final class AnalyzerFacadeForJS { return bindingContext; } + + //NOTE: web demo related method + @SuppressWarnings("UnusedDeclaration") + @NotNull + public static BindingContext analyzeFiles(@NotNull Collection files, @NotNull Config config) { + return analyzeFiles(files, Predicates.alwaysTrue(), config); + } + @NotNull public static BindingContext analyzeFiles(@NotNull Collection files, - Predicate filesToAnalyzeCompletely, @NotNull Config config) { + @NotNull Predicate filesToAnalyzeCompletely, @NotNull Config config) { Project project = config.getProject(); BindingTraceContext bindingTraceContext = new BindingTraceContext(); From 53ebe5325f23a86a47a37d8fa5acca16b7656f11 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Wed, 16 May 2012 15:18:40 +0400 Subject: [PATCH 69/88] Move util methods from K2JSTranslator to FacadeUtils class --- .../jetbrains/k2js/facade/FacadeUtils.java | 58 +++++++++++++++++++ .../jetbrains/k2js/facade/K2JSTranslator.java | 34 ++--------- 2 files changed, 64 insertions(+), 28 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/k2js/facade/FacadeUtils.java diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/FacadeUtils.java b/js/js.translator/src/org/jetbrains/k2js/facade/FacadeUtils.java new file mode 100644 index 00000000000..4a893060841 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/facade/FacadeUtils.java @@ -0,0 +1,58 @@ +/* + * Copyright 2010-2012 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.k2js.facade; + +import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +/** + * @author Pavel Talanov + */ +public class FacadeUtils { + + private FacadeUtils() { + } + + public static void writeCodeToFile(@NotNull String outputPath, @NotNull String programCode) throws IOException { + File file = new File(outputPath); + FileUtil.createParentDirs(file); + FileWriter writer = new FileWriter(file); + try { + writer.write(programCode); + } + finally { + writer.close(); + } + } + + @NotNull + public static List parseString(@NotNull String argumentString) { + List result = new ArrayList(); + StringTokenizer stringTokenizer = new StringTokenizer(argumentString); + while (stringTokenizer.hasMoreTokens()) { + result.add(stringTokenizer.nextToken()); + } + return result; + } +} diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java index 18025ec0cc8..acf9631371d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -19,7 +19,6 @@ package org.jetbrains.k2js.facade; import com.google.common.collect.Lists; import com.google.dart.compiler.backend.js.ast.JsProgram; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -31,10 +30,12 @@ import org.jetbrains.k2js.generate.CodeGenerator; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.utils.JetFileUtils; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import static org.jetbrains.k2js.facade.FacadeUtils.parseString; +import static org.jetbrains.k2js.facade.FacadeUtils.writeCodeToFile; /** * @author Pavel Talanov @@ -51,18 +52,6 @@ public final class K2JSTranslator { writeCodeToFile(outputPath, programCode); } - private static void writeCodeToFile(@NotNull String outputPath, @NotNull String programCode) throws IOException { - File file = new File(outputPath); - FileUtil.createParentDirs(file); - FileWriter writer = new FileWriter(file); - try { - writer.write(programCode); - } - finally { - writer.close(); - } - } - @NotNull private final Config config; @@ -107,17 +96,6 @@ public final class K2JSTranslator { return Translation.generateAst(bindingContext, Lists.newArrayList(files), mainCallParameters, config.getTarget()); } - //TODO: util - @NotNull - private static List parseString(@NotNull String argumentString) { - List result = new ArrayList(); - StringTokenizer stringTokenizer = new StringTokenizer(argumentString); - while (stringTokenizer.hasMoreTokens()) { - result.add(stringTokenizer.nextToken()); - } - return result; - } - @NotNull private Project getProject() { return config.getProject(); From 3b95ba798ed2fc5dea24e7bf0109fb80bbdb5929 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 16 May 2012 17:08:59 +0400 Subject: [PATCH 70/88] Added navigation to YouTrack issues from commit messages. --- .idea/vcs.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 275077f8255..0503e944c52 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,5 +1,15 @@ + + + From feaf218836bbdabcd4cc5a4b6b5830f9740d3854 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Wed, 16 May 2012 15:32:17 +0400 Subject: [PATCH 71/88] Cosmetics --- idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java | 4 ++-- .../src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java | 1 + .../src/org/jetbrains/k2js/facade/FacadeUtils.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java index bdb857fdc33..dc8589e46fe 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java @@ -64,12 +64,12 @@ public final class K2JSCompiler implements TranslatingCompiler { return; } - final Module module = getModule(context, moduleChunk); + Module module = getModule(context, moduleChunk); if (module == null) { return; } - final CompilerEnvironment environment = CompilerEnvironment.getEnvironmentFor(context, module, /*tests = */ false); + CompilerEnvironment environment = CompilerEnvironment.getEnvironmentFor(context, module, /*tests = */ false); if (!environment.success()) { environment.reportErrorsTo(context); return; diff --git a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java index c356dd13732..93a6e558695 100644 --- a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java @@ -70,6 +70,7 @@ public final class K2JSRunnerUtils { notifySuccess(outputDirPath); } + @NotNull public static String constructPathToGeneratedFile(@NotNull Project project, @NotNull String outputDirPath) { return outputDirPath + "/" + project.getName() + ".js"; } diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/FacadeUtils.java b/js/js.translator/src/org/jetbrains/k2js/facade/FacadeUtils.java index 4a893060841..9d2e5c80580 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/FacadeUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/FacadeUtils.java @@ -29,7 +29,7 @@ import java.util.StringTokenizer; /** * @author Pavel Talanov */ -public class FacadeUtils { +public final class FacadeUtils { private FacadeUtils() { } From c8fe0080c781292bf0ee4e28b43144208fb25fde Mon Sep 17 00:00:00 2001 From: pTalanov Date: Wed, 16 May 2012 17:42:38 +0400 Subject: [PATCH 72/88] Fix compilation for maven build --- .../src/org/jetbrains/jet/cli/js/K2JSCompiler.java | 5 +++-- .../src/org/jetbrains/k2js/config/Config.java | 11 +++++++++-- .../jetbrains/kotlin/maven/K2JSCompilerPlugin.java | 8 +------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java index 6f69093b3dd..c6a4107acc0 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java @@ -120,9 +120,10 @@ public class K2JSCompiler extends CLICompiler generateLibFiles() { @@ -43,6 +43,13 @@ public abstract class Config { }; } + //NOTE: used by mvn build + @SuppressWarnings("UnusedDeclaration") + @NotNull + public static Config getEmptyConfig(@NotNull Project project) { + return getEmptyConfig(project, EcmaVersion.defaultVersion()); + } + @NotNull protected static final List LIB_FILE_NAMES = Arrays.asList( "/core/annotations.kt", diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerPlugin.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerPlugin.java index 9f5d7b4dfec..7e68e648cad 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerPlugin.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerPlugin.java @@ -45,13 +45,7 @@ public class K2JSCompilerPlugin implements CompilerPlugin { List sources = context.getFiles(); if (bindingContext != null && sources != null && project != null) { - Config config = new Config(project) { - @NotNull - @Override - protected List generateLibFiles() { - return new ArrayList(); - } - }; + Config config = Config.getEmptyConfig(project); try { From 31a1aefeb576542d74c9293366d89b09025155fb Mon Sep 17 00:00:00 2001 From: pTalanov Date: Wed, 16 May 2012 18:17:24 +0400 Subject: [PATCH 73/88] K2JSBrowserProgramRunner copies output JavaScript file from output dir instead of generating JavaScript againg --- .../k2jsrun/K2JSBrowserProgramRunner.java | 45 ++----- .../jet/plugin/k2jsrun/K2JSRunnerUtils.java | 110 +++++++++--------- 2 files changed, 63 insertions(+), 92 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSBrowserProgramRunner.java b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSBrowserProgramRunner.java index 53a8034f951..5e4036f498d 100644 --- a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSBrowserProgramRunner.java +++ b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSBrowserProgramRunner.java @@ -23,58 +23,35 @@ import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.GenericProgramRunner; import com.intellij.execution.ui.RunContentDescriptor; -import com.intellij.ide.browsers.BrowsersConfiguration; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFileManager; import org.jetbrains.annotations.NotNull; +import static org.jetbrains.jet.plugin.k2jsrun.K2JSRunnerUtils.copyJSFileFromOutputToDestination; +import static org.jetbrains.jet.plugin.k2jsrun.K2JSRunnerUtils.openBrowser; + /** * @author Pavel Talanov */ public final class K2JSBrowserProgramRunner extends GenericProgramRunner { @Override - protected RunContentDescriptor doExecute(Project project, - Executor executor, - RunProfileState state, - RunContentDescriptor contentToReuse, - ExecutionEnvironment env) throws ExecutionException { + protected RunContentDescriptor doExecute(final Project project, + Executor executor, + RunProfileState state, + RunContentDescriptor contentToReuse, + ExecutionEnvironment env) throws ExecutionException { if (project == null) { return null; } try { - K2JSConfigurationSettings configurationSettings = getSettings(state); - try { - K2JSRunnerUtils.translateAndSave(project, configurationSettings.getGeneratedFilePath()); - } - catch (Throwable e) { - K2JSRunnerUtils.notifyFailure(e); - return null; - } - openBrowser(configurationSettings); + copyJSFileFromOutputToDestination(project, K2JSRunnerUtils.getSettings(state)); + openBrowser(K2JSRunnerUtils.getSettings(state)); } - catch (Exception e) { + catch (Throwable e) { throw new ExecutionException(e); } return null; } - private static void openBrowser(@NotNull K2JSConfigurationSettings configurationSettings) { - if (!configurationSettings.isShouldOpenInBrowserAfterTranslation()) { - return; - } - String filePath = configurationSettings.getPageToOpenFilePath(); - String url = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, filePath); - BrowsersConfiguration.launchBrowser(configurationSettings.getBrowserFamily(), url); - } - - @NotNull - private static K2JSConfigurationSettings getSettings(@NotNull RunProfileState state) { - RunProfile profile = state.getRunnerSettings().getRunProfile(); - assert profile instanceof K2JSRunConfiguration; - return ((K2JSRunConfiguration)profile).settings(); - } - @NotNull @Override public String getRunnerId() { diff --git a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java index 93a6e558695..bbb782d9033 100644 --- a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java @@ -16,28 +16,22 @@ package org.jetbrains.jet.plugin.k2jsrun; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationType; -import com.intellij.notification.Notifications; +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.configurations.RunProfileState; +import com.intellij.ide.browsers.BrowsersConfiguration; +import com.intellij.openapi.compiler.CompilerPaths; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; +import com.intellij.openapi.vfs.VirtualFileManager; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.plugin.project.IDEAConfig; -import org.jetbrains.k2js.facade.K2JSTranslator; +import org.jetbrains.annotations.Nullable; -import java.util.Collection; -import java.util.List; -import java.util.Set; - -import static org.jetbrains.jet.plugin.actions.JavaToKotlinActionUtil.allVirtualFiles; +import java.io.File; +import java.io.IOException; /** * @author Pavel Talanov @@ -47,57 +41,57 @@ public final class K2JSRunnerUtils { private K2JSRunnerUtils() { } - public static void notifyFailure(@NotNull Throwable exception) { - Notifications.Bus.notify(new Notification("JsTranslator", "Translation failed.", - "Exception: " + exception.getMessage(), - NotificationType.ERROR)); - } - - private static void notifySuccess(@NotNull String outputPath) { - Notifications.Bus.notify(new Notification("JsTranslator", "Translation successful.", - "Generated file: " + outputPath, - NotificationType.INFORMATION)); - } - - public static void translateAndSave(@NotNull Project project, @NotNull String outputDirPath) throws Exception { - Set allVirtualFiles = getAllProjectVirtualFiles(project); - List kotlinFiles = getJetFiles(allVirtualFiles, project); - String outputFilePath = constructPathToGeneratedFile(project, outputDirPath); - K2JSTranslator.translateWithCallToMainAndSaveToFile(kotlinFiles, - outputFilePath, - new IDEAConfig(project) - ); - notifySuccess(outputDirPath); - } - @NotNull public static String constructPathToGeneratedFile(@NotNull Project project, @NotNull String outputDirPath) { return outputDirPath + "/" + project.getName() + ".js"; } - @NotNull - private static Set getAllProjectVirtualFiles(@NotNull Project project) { - Module[] modules = ModuleManager.getInstance(project).getModules(); - Set allVirtualFiles = Sets.newHashSet(); - for (Module module : modules) { - VirtualFile[] roots = ModuleRootManager.getInstance(module).getSourceRoots(); - allVirtualFiles.addAll(allVirtualFiles(roots)); + public static void copyJSFileFromOutputToDestination(@NotNull Project project, + @NotNull K2JSConfigurationSettings configurationSettings) { + VirtualFile outputDir = getOutputDir(project); + if (outputDir == null) { + throw new RuntimeException("Cannot find output dir for project " + project.getName()); } - return allVirtualFiles; + String pathToGeneratedJsFile = constructPathToGeneratedFile(project, outputDir.getPath()); + try { + File fileToCopy = new File(pathToGeneratedJsFile); + File dirToCopyTo = new File(configurationSettings.getGeneratedFilePath()); + File fileToCopyTo = new File(dirToCopyTo, fileToCopy.getName()); + FileUtil.copy(fileToCopy, fileToCopyTo); + } + catch (IOException e) { + throw new RuntimeException("Output JavaScript file was not generated or missing.", e); + } + } + + @Nullable + private static VirtualFile getOutputDir(@NotNull Project project) { + Module module = getJsModule(project); + return CompilerPaths.getModuleOutputDirectory(module, /*forTests = */ false); } @NotNull - private static List getJetFiles(@NotNull Collection virtualFiles, - @NotNull Project project) { - List kotlinFiles = Lists.newArrayList(); - - PsiManager psiManager = PsiManager.getInstance(project); - for (VirtualFile virtualFile : virtualFiles) { - PsiFile psiFile = psiManager.findFile(virtualFile); - if (psiFile instanceof JetFile) { - kotlinFiles.add((JetFile) psiFile); - } + private static Module getJsModule(@NotNull Project project) { + Module[] modules = ModuleManager.getInstance(project).getModules(); + if (modules.length != 1) { + throw new UnsupportedOperationException("Kotlin to JavaScript translator temporarily does not support multiple modules."); } - return kotlinFiles; + return modules[0]; + } + + public static void openBrowser(@NotNull K2JSConfigurationSettings configurationSettings) { + if (!configurationSettings.isShouldOpenInBrowserAfterTranslation()) { + return; + } + String filePath = configurationSettings.getPageToOpenFilePath(); + String url = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, filePath); + BrowsersConfiguration.launchBrowser(configurationSettings.getBrowserFamily(), url); + } + + @NotNull + public static K2JSConfigurationSettings getSettings(@NotNull RunProfileState state) { + RunProfile profile = state.getRunnerSettings().getRunProfile(); + assert profile instanceof K2JSRunConfiguration; + return ((K2JSRunConfiguration) profile).settings(); } } From ce896f931a374b50377af4129e6f078c9715f7fe Mon Sep 17 00:00:00 2001 From: pTalanov Date: Wed, 16 May 2012 19:30:23 +0400 Subject: [PATCH 74/88] Issue related to KT-1962 Correctly reference this object in wrapped function literal --- .../k2js/test/semantics/ClosureTest.java | 5 +++- .../translate/context/TemporaryVariable.java | 10 ++++++- .../expression/FunctionTranslator.java | 27 +++++++++---------- .../utils/closure/CaptureClosureVisitor.java | 3 +++ .../closure/cases/closureReferencingMember.kt | 24 +++++++++++++++++ 5 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 js/js.translator/testFiles/closure/cases/closureReferencingMember.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClosureTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClosureTest.java index e339c280616..46aaaab3489 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClosureTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClosureTest.java @@ -31,8 +31,11 @@ public final class ClosureTest extends SingleFileTranslationTest { fooBoxTest(); } - public void testLocalParameterInCallback() throws Exception { fooBoxTest(); } + + public void testClosureReferencingMember() throws Exception { + fooBoxTest(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TemporaryVariable.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TemporaryVariable.java index ef0f175d5db..7a343078b0b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TemporaryVariable.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TemporaryVariable.java @@ -31,10 +31,13 @@ public final class TemporaryVariable { private final JsExpression assignmentExpression; @NotNull private final JsName variableName; + @NotNull + private final JsExpression initExpression; /*package*/ TemporaryVariable(@NotNull JsName temporaryName, @NotNull JsExpression initExpression) { this.variableName = temporaryName; - this.assignmentExpression = AstUtil.newAssignment(variableName.makeRef(), initExpression); + this.initExpression = initExpression; + this.assignmentExpression = AstUtil.newAssignment(variableName.makeRef(), this.initExpression); } @NotNull @@ -51,4 +54,9 @@ public final class TemporaryVariable { public JsExpression assignmentExpression() { return assignmentExpression; } + + @NotNull + public JsExpression initExpression() { + return initExpression; + } } \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index a25486beab3..e5c536b0b99 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -40,9 +40,9 @@ import java.util.ArrayList; import java.util.List; import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor; -import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.*; import static org.jetbrains.k2js.translate.utils.FunctionBodyTranslator.translateFunctionBody; import static org.jetbrains.k2js.translate.utils.JsAstUtils.setParameters; +import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.*; /** @@ -52,7 +52,7 @@ public final class FunctionTranslator extends AbstractTranslator { @NotNull public static FunctionTranslator newInstance(@NotNull JetDeclarationWithBody function, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { return new FunctionTranslator(function, context); } @@ -73,7 +73,7 @@ public final class FunctionTranslator extends AbstractTranslator { private final JsBlock functionBody; private FunctionTranslator(@NotNull JetDeclarationWithBody functionDeclaration, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { super(context); this.descriptor = getFunctionDescriptor(context.bindingContext(), functionDeclaration); this.functionDeclaration = functionDeclaration; @@ -140,7 +140,11 @@ public final class FunctionTranslator extends AbstractTranslator { public JsExpression translateAsLiteral() { assert getExpectedThisDescriptor(descriptor) == null; generateFunctionObject(); - return mayBeWrapInClosureCaptureExpression(mayBeWrapWithThisAlias()); + ClosureContext closureContext = ClosureUtils.captureClosure(context(), (JetElement) functionDeclaration); + if (closureContext.getDescriptors().isEmpty()) { + return mayBeWrapWithThisAlias(); + } + return wrapInClosureCaptureExpression(functionObject, closureContext); } @NotNull @@ -160,23 +164,18 @@ public final class FunctionTranslator extends AbstractTranslator { return containingClass != null; } - @NotNull - private JsExpression mayBeWrapInClosureCaptureExpression(@NotNull JsExpression wrappedExpression) { - ClosureContext closureContext = ClosureUtils.captureClosure(context(), (JetElement)functionDeclaration); - if (closureContext.getDescriptors().isEmpty()) { - return wrappedExpression; - } - return wrapInClosureCaptureExpression(wrappedExpression, closureContext); - } - @NotNull private JsExpression wrapInClosureCaptureExpression(@NotNull JsExpression wrappedExpression, - @NotNull ClosureContext closureContext) { + @NotNull ClosureContext closureContext) { JsFunction dummyFunction = new JsFunction(context().jsScope()); JsInvocation dummyFunctionInvocation = AstUtil.newInvocation(dummyFunction); for (VariableDescriptor variableDescriptor : closureContext.getDescriptors()) { dummyFunction.getParameters().add(new JsParameter(context().getNameForDescriptor(variableDescriptor))); dummyFunctionInvocation.getArguments().add(ReferenceTranslator.translateAsLocalNameReference(variableDescriptor, context())); + if (aliasForContainingClassThis != null) { + dummyFunction.getParameters().add(new JsParameter(aliasForContainingClassThis.name())); + dummyFunctionInvocation.getArguments().add(aliasForContainingClassThis.initExpression()); + } } dummyFunction.setBody(AstUtil.newBlock(new JsReturn(wrappedExpression))); return dummyFunctionInvocation; diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/CaptureClosureVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/CaptureClosureVisitor.java index 021417724f8..0efd171d933 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/CaptureClosureVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/closure/CaptureClosureVisitor.java @@ -56,6 +56,7 @@ public class CaptureClosureVisitor extends JetTreeVisitor { if (!(descriptor instanceof VariableDescriptor)) { return null; } + VariableDescriptor variableDescriptor = (VariableDescriptor) descriptor; PsiElement variableDeclaration = BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor); if (variableDeclaration == null) { @@ -69,6 +70,8 @@ public class CaptureClosureVisitor extends JetTreeVisitor { context.put(variableDescriptor); return null; } + + boolean isLoopParameter = variableDeclaration.getNode().getElementType().equals(JetNodeTypes.LOOP_PARAMETER); if (isLoopParameter) { context.put(variableDescriptor); diff --git a/js/js.translator/testFiles/closure/cases/closureReferencingMember.kt b/js/js.translator/testFiles/closure/cases/closureReferencingMember.kt new file mode 100644 index 00000000000..8cdbf5ea0d4 --- /dev/null +++ b/js/js.translator/testFiles/closure/cases/closureReferencingMember.kt @@ -0,0 +1,24 @@ +package foo + +class A() { + + var i = 0 + + fun f() { + for (j in 0..2) { + foo { + i += j + } + } + } +} + +fun foo(f : ()->Unit) { + f() +} + +fun box() : Boolean { + val a = A() + a.f() + return a.i == 3 +} \ No newline at end of file From 41547488a6ea7d38b2f0dc46b0ed761fa8e4992f Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 16 May 2012 18:40:11 +0400 Subject: [PATCH 75/88] Enabled "Field may be final" inspection. --- .idea/inspectionProfiles/idea_default.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/.idea/inspectionProfiles/idea_default.xml b/.idea/inspectionProfiles/idea_default.xml index 87c20723c79..23bae163cd7 100644 --- a/.idea/inspectionProfiles/idea_default.xml +++ b/.idea/inspectionProfiles/idea_default.xml @@ -67,6 +67,7 @@ +