Present "data" annotation to standard library

This commit is contained in:
Alexander Udalov
2012-08-28 18:31:09 +04:00
parent b46187a560
commit 95dddadb36
3 changed files with 28 additions and 2 deletions
+1
View File
@@ -4,6 +4,7 @@ public trait Annotation
public annotation class volatile : Annotation
public annotation class atomic : Annotation
public annotation class data : Annotation
public fun <R> synchronized(lock: Any, block : () -> R) : R
@@ -99,6 +99,7 @@ public class JetStandardLibrary {
private ClassDescriptor enumClass;
private ClassDescriptor annotationClass;
private ClassDescriptor volatileClass;
private ClassDescriptor dataClass;
private JetType stringType;
private JetType annotationType;
@@ -170,7 +171,9 @@ public class JetStandardLibrary {
this.arrayClass = getStdClassByName("Array");
this.throwableClass = getStdClassByName("Throwable");
this.enumClass = getStdClassByName("Enum");
this.volatileClass = getStdClassByName("volatile");
this.dataClass = getStdClassByName("data");
this.iterableClass = getStdClassByName("Iterable");
this.iteratorClass = getStdClassByName("Iterator");
@@ -498,6 +501,11 @@ public class JetStandardLibrary {
return getEnumType(Variance.INVARIANT, argument);
}
@NotNull
public ClassDescriptor getDataClassAnnotation() {
return dataClass;
}
@NotNull
public JetType getArrayType(@NotNull Variance projectionType, @NotNull JetType argument) {
List<TypeProjection> types = Collections.singletonList(new TypeProjection(projectionType, argument));
@@ -559,10 +567,24 @@ public class JetStandardLibrary {
}
public boolean isVolatile(@NotNull PropertyDescriptor descriptor) {
return containsAnnotation(descriptor, volatileClass);
}
public static boolean isData(@NotNull ClassDescriptor descriptor) {
if (initializing) {
// This is a hack to make this method callable while resolving standard library
// (otherwise getInstance() would throw an Exception)
// This also means that "data" annotation has no effect in standard library
return false;
}
return containsAnnotation(descriptor, getInstance().dataClass);
}
private static boolean containsAnnotation(DeclarationDescriptor descriptor, ClassDescriptor annotationClass) {
List<AnnotationDescriptor> annotations = descriptor.getOriginal().getAnnotations();
if (annotations != null) {
for(AnnotationDescriptor annotation: annotations) {
if (volatileClass.equals(annotation.getType().getConstructor().getDeclarationDescriptor())) {
for (AnnotationDescriptor annotation : annotations) {
if (annotationClass.equals(annotation.getType().getConstructor().getDeclarationDescriptor())) {
return true;
}
}
+3
View File
@@ -1447,6 +1447,9 @@ public final class jet.Tuple9</*0*/ out T1 : jet.Any?, /*1*/ out T2 : jet.Any?,
public final annotation class jet.atomic : jet.Annotation {
public final /*constructor*/ fun <init>(): jet.atomic
}
public final annotation class jet.data : jet.Annotation {
public final /*constructor*/ fun <init>(): jet.data
}
public final annotation class jet.volatile : jet.Annotation {
public final /*constructor*/ fun <init>(): jet.volatile
}