adding annotations checks

This commit is contained in:
Pavel Talanov
2012-01-30 16:29:24 +04:00
parent 60edf1a6c1
commit 97f7b9f1c1
3 changed files with 107 additions and 79 deletions
+28 -24
View File
@@ -13,13 +13,9 @@
</component>
<component name="ChangeListManager">
<list default="true" id="f02ef53d-47a4-4f5e-a1aa-3df68aae9b20" name="Default" comment="">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/AbstractDeclarationVisitor.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\src\org\jetbrains\k2js\translate\context\declaration\DeclarationVisitor.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/DeclarationFacade.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/DeclarationFacade.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java" />
</list>
<ignored path="k2js.iws" />
<ignored path=".idea/workspace.xml" />
@@ -147,8 +143,10 @@
<file leaf-file-name="KotlinDeclarationVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="48" column="20" selection-start="1909" selection-end="1909" vertical-scroll-proportion="0.0">
<folding />
<state line="41" column="20" selection-start="1640" selection-end="1640" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="false" />
</folding>
</state>
</provider>
</entry>
@@ -156,8 +154,10 @@
<file leaf-file-name="JsAnnotationsUtils.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java">
<provider selected="true" editor-type-id="text-editor">
<state line="9" column="0" selection-start="170" selection-end="170" vertical-scroll-proportion="0.0">
<folding />
<state line="26" column="66" selection-start="957" selection-end="957" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
@@ -174,7 +174,7 @@
<file leaf-file-name="NativeDeclarationVisitor.java" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="28" selection-start="1170" selection-end="1170" vertical-scroll-proportion="0.8110687">
<state line="40" column="73" selection-start="1825" selection-end="1825" vertical-scroll-proportion="0.5458015">
<folding>
<element signature="imports" expanded="true" />
</folding>
@@ -214,7 +214,7 @@
<file leaf-file-name="StandardClasses.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java">
<provider selected="true" editor-type-id="text-editor">
<state line="99" column="8" selection-start="3147" selection-end="3147" vertical-scroll-proportion="0.0">
<state line="99" column="10" selection-start="3149" selection-end="3149" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -352,8 +352,8 @@
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/DeclarationVisitor.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/AbstractDeclarationVisitor.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java" />
</list>
</option>
@@ -1191,7 +1191,7 @@
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32977018" sideWeight="0.6570605" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3997862" sideWeight="0.6705998" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.22928914" sideWeight="0.55043226" order="0" side_tool="false" content_ui="combo" />
<window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.44956774" sideWeight="0.8530198" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.44956774" sideWeight="0.8530198" order="2" side_tool="false" content_ui="tabs" />
<window_info id="CodeWindow" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.0908605" sideWeight="0.7146974" order="2" side_tool="false" content_ui="combo" />
<window_info id="ResolveWindow" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
@@ -1238,7 +1238,7 @@
<option name="CREATE_PATCH_EXPAND_DETAILS_DEFAULT" value="true" />
<option name="SHOW_FILE_HISTORY_DETAILS" value="true" />
<option name="FORCE_NON_EMPTY_COMMENT" value="false" />
<option name="LAST_COMMIT_MESSAGE" value="implementing new declaration logic" />
<option name="LAST_COMMIT_MESSAGE" value="refactoring declaration visitor" />
<option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" />
<option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
@@ -1251,7 +1251,6 @@
<option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
<option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
<option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" />
<MESSAGE value="migrated according to the last when changes" />
<MESSAGE value="Very big code migration started. Still in progress. Tests fail." />
<MESSAGE value="fix most of the tests" />
<MESSAGE value="refactor access translator logic" />
@@ -1276,6 +1275,7 @@
<MESSAGE value="migrated to new code" />
<MESSAGE value="migrating code" />
<MESSAGE value="implementing new declaration logic" />
<MESSAGE value="refactoring declaration visitor" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
@@ -1329,7 +1329,7 @@
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java">
<provider selected="true" editor-type-id="text-editor">
<state line="99" column="8" selection-start="3147" selection-end="3147" vertical-scroll-proportion="0.0">
<state line="99" column="10" selection-start="3149" selection-end="3149" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -1382,23 +1382,27 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="9" column="0" selection-start="170" selection-end="170" vertical-scroll-proportion="0.0">
<folding />
<state line="41" column="20" selection-start="1640" selection-end="1640" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/KotlinDeclarationVisitor.java">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/JsAnnotationsUtils.java">
<provider selected="true" editor-type-id="text-editor">
<state line="48" column="20" selection-start="1909" selection-end="1909" vertical-scroll-proportion="0.0">
<folding />
<state line="26" column="66" selection-start="957" selection-end="957" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/context/declaration/NativeDeclarationVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="28" selection-start="1170" selection-end="1170" vertical-scroll-proportion="0.8110687">
<state line="40" column="73" selection-start="1825" selection-end="1825" vertical-scroll-proportion="0.5458015">
<folding>
<element signature="imports" expanded="true" />
</folding>
@@ -1,5 +1,13 @@
package org.jetbrains.k2js.translate.context.declaration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
/**
* @author Pavel Talanov
*/
@@ -8,5 +16,66 @@ public final class JsAnnotationsUtils {
private JsAnnotationsUtils() {
}
@NotNull
public static String getNativeName(@NotNull FunctionDescriptor descriptor) {
if (hasNativeFunctionAnnotation(descriptor)) {
return getNativeFunctionName(descriptor);
}
if (declaredInNativeClass(descriptor)) {
return descriptor.getName();
}
throw new AssertionError("Use isNativeFunction to check");
}
public static boolean isNativeFunction(@NotNull FunctionDescriptor functionDescriptor) {
return hasNativeFunctionAnnotation(functionDescriptor) || declaredInNativeClass(functionDescriptor);
}
public static boolean isNativeClass(@NotNull ClassDescriptor classDescriptor) {
return hasNativeClassAnnotation(classDescriptor);
}
private static boolean declaredInNativeClass(@NotNull DeclarationDescriptor descriptor) {
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
if (!(containingDeclaration instanceof ClassDescriptor)) return false;
return hasNativeClassAnnotation((ClassDescriptor) containingDeclaration);
}
private static boolean hasNativeFunctionAnnotation(@NotNull FunctionDescriptor annotationDescriptor) {
return (getAnnotationByName(annotationDescriptor, "js.annotations.JavascriptNativeFunction") != null);
}
private static boolean hasNativeClassAnnotation(@NotNull ClassDescriptor descriptor) {
return (getAnnotationByName(descriptor, "JavascriptNativeClass") != null);
}
@NotNull
private static String getNativeFunctionName(@NotNull DeclarationDescriptor declarationDescriptor) {
AnnotationDescriptor annotationDescriptor =
getAnnotationByName(declarationDescriptor, "js.annotations.JavascriptNativeFunction");
assert annotationDescriptor != null;
Object value = annotationDescriptor.getValueArguments().iterator().next().getValue();
assert value instanceof String : "Native function annotation should have one String parameter";
return (String) value;
}
@Nullable
private static AnnotationDescriptor getAnnotationByName(@NotNull DeclarationDescriptor descriptor,
@NotNull String FQName) {
for (AnnotationDescriptor annotationDescriptor : descriptor.getAnnotations()) {
String annotationClassFQName = getAnnotationClassFQName(annotationDescriptor);
if (annotationClassFQName.equals(FQName)) {
return annotationDescriptor;
}
}
return null;
}
@NotNull
private static String getAnnotationClassFQName(@NotNull AnnotationDescriptor annotationDescriptor) {
DeclarationDescriptor annotationDeclaration =
annotationDescriptor.getType().getConstructor().getDeclarationDescriptor();
assert annotationDeclaration != null : "Annotation supposed to have a declaration";
return DescriptorUtils.getFQName(annotationDeclaration);
}
}
@@ -2,12 +2,10 @@ package org.jetbrains.k2js.translate.context.declaration;
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.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.k2js.translate.context.NamingScope;
/**
@@ -32,11 +30,7 @@ public final class NativeDeclarationVisitor extends AbstractDeclarationVisitor {
@Override
protected JsName doDeclareName(@NotNull DeclarationDescriptor descriptor, @NotNull DeclarationContext context,
@NotNull String recommendedName) {
if (!(descriptor instanceof FunctionDescriptor)) {
throw new IllegalStateException();
}
String nativeName = getNativeName((FunctionDescriptor) descriptor);
assert nativeName != null;
String nativeName = JsAnnotationsUtils.getNativeName((FunctionDescriptor) descriptor);
JsName jsName = context.getScope().
declareVariable(descriptor, nativeName, false);
jsName.setObfuscatable(false);
@@ -47,56 +41,17 @@ public final class NativeDeclarationVisitor extends AbstractDeclarationVisitor {
@Override
protected boolean accept(@NotNull DeclarationDescriptor descriptor) {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
@Nullable
private String getNativeName(@NotNull FunctionDescriptor descriptor) {
if (isJavascriptNativeFunction(descriptor)) {
return getNativeFunctionName(descriptor);
if (descriptor instanceof NamespaceDescriptor) {
return true;
}
if (isJavascriptNativeClass(descriptor.getContainingDeclaration())) {
return descriptor.getName();
if (descriptor instanceof FunctionDescriptor) {
return JsAnnotationsUtils.isNativeFunction((FunctionDescriptor) descriptor);
}
return null;
}
private boolean isJavascriptNativeFunction(@NotNull DeclarationDescriptor annotationDescriptor) {
return (getAnnotationByName(annotationDescriptor, "js.annotations.JavascriptNativeFunction") != null);
}
private boolean isJavascriptNativeClass(@NotNull DeclarationDescriptor descriptor) {
assert descriptor instanceof ClassDescriptor;
return (getAnnotationByName(descriptor, "JavascriptNativeClass") != null);
}
@NotNull
private String getNativeFunctionName(@NotNull DeclarationDescriptor declarationDescriptor) {
AnnotationDescriptor annotationDescriptor =
getAnnotationByName(declarationDescriptor, "js.annotations.JavascriptNativeFunction");
assert annotationDescriptor != null;
Object value = annotationDescriptor.getValueArguments().iterator().next().getValue();
assert value instanceof String : "Native function annotation should have one String parameter";
return (String) value;
}
@Nullable
private AnnotationDescriptor getAnnotationByName(@NotNull DeclarationDescriptor descriptor,
@NotNull String FQName) {
for (AnnotationDescriptor annotationDescriptor : descriptor.getAnnotations()) {
String annotationClassFQName = getAnnotationClassFQName(annotationDescriptor);
if (annotationClassFQName.equals(FQName)) {
return annotationDescriptor;
}
if (descriptor instanceof ClassDescriptor) {
return JsAnnotationsUtils.isNativeClass((ClassDescriptor) descriptor);
}
return null;
throw new AssertionError();
}
@NotNull
private String getAnnotationClassFQName(@NotNull AnnotationDescriptor annotationDescriptor) {
DeclarationDescriptor annotationDeclaration =
annotationDescriptor.getType().getConstructor().getDeclarationDescriptor();
assert annotationDeclaration != null : "Annotation supposed to have a declaration";
return DescriptorUtils.getFQName(annotationDeclaration);
}
}