Do not translate library (marked by annotation) declarations.

This commit is contained in:
Pavel V. Talanov
2012-08-14 17:46:45 +04:00
parent 954c1ee29f
commit b0856cb364
5 changed files with 68 additions and 3 deletions
@@ -72,6 +72,10 @@ public final class NativeInteropTest extends SingleFileTranslationTest {
fooBoxTest();
}
public void testLibrary() throws Exception {
fooBoxTest();
}
public void testKt2209() throws Exception {
fooBoxTest();
}
@@ -28,8 +28,6 @@ import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.initializer.InitializerUtils;
import org.jetbrains.k2js.translate.initializer.InitializerVisitor;
import org.jetbrains.k2js.translate.utils.AnnotationsUtils;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.JsAstUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
@@ -39,6 +37,8 @@ import java.util.List;
import java.util.Map;
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty;
import static org.jetbrains.k2js.translate.utils.AnnotationsUtils.isPredefinedObject;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForElement;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor;
/**
@@ -64,7 +64,7 @@ final class NamespaceTranslator extends AbstractTranslator {
public void translate(JetFile file) {
for (JetDeclaration declaration : file.getDeclarations()) {
if (!AnnotationsUtils.isNativeObject(BindingUtils.getDescriptorForElement(bindingContext(), declaration))) {
if (!isPredefinedObject(getDescriptorForElement(bindingContext(), declaration))) {
declaration.accept(visitor, context());
}
}
@@ -112,6 +112,15 @@ public final class AnnotationsUtils {
return hasAnnotationOrInsideAnnotatedClass(descriptor, PredefinedAnnotation.LIBRARY);
}
public static boolean isPredefinedObject(@NotNull DeclarationDescriptor descriptor) {
for (PredefinedAnnotation annotation : PredefinedAnnotation.values()) {
if (hasAnnotationOrInsideAnnotatedClass(descriptor, annotation)) {
return true;
}
}
return false;
}
public static boolean hasAnnotationOrInsideAnnotatedClass(@NotNull DeclarationDescriptor descriptor,
@NotNull PredefinedAnnotation annotation) {
return hasAnnotationOrInsideAnnotatedClass(descriptor, annotation.getFQName());
@@ -0,0 +1,15 @@
package foo
library class A() {
library fun f() {}
library fun f(a: Int) {}
}
library fun getResult() = false
fun box(): Boolean {
val a = A()
a.f()
a.f(2)
return getResult()
}
@@ -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.
*/
(function () {
var c = 0;
Kotlin.A = Kotlin.$createClass(
{
initialize:function () {
this.f = function(i) {
if (i === undefined && c === 0) {
c = 1;
}
if (i === 2 && c === 1) {
c = 2;
}
}
}
});
Kotlin.getResult = function () {
return c === 2;
};
})();