package com.redhat.ceylon.eclipse.core.model.mirror;
import java.util.List;
import ceylon.language.meta.model.Interface;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.model.loader.AbstractModelLoader;
import com.redhat.ceylon.model.loader.mirror.AnnotationMirror;
import com.redhat.ceylon.model.loader.mirror.ClassMirror;
import com.redhat.ceylon.model.loader.mirror.FieldMirror;
import com.redhat.ceylon.model.loader.mirror.MethodMirror;
import com.redhat.ceylon.model.loader.mirror.PackageMirror;
import com.redhat.ceylon.model.loader.mirror.TypeMirror;
import com.redhat.ceylon.model.loader.mirror.TypeParameterMirror;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.Module;
import com.redhat.ceylon.model.typechecker.model.Scope;
import com.redhat.ceylon.model.typechecker.model.Class;
import com.redhat.ceylon.model.typechecker.model.TypeDeclaration;
public class SourceClass implements ClassMirror {
private SourceDeclarationHolder sourceDeclarationHolder;
private String cacheKey;
private String qualifiedName;
private String flatName;
public SourceClass(SourceDeclarationHolder sourceDeclarationHolder) {
this.sourceDeclarationHolder = sourceDeclarationHolder;
}
@Override
public AnnotationMirror getAnnotation(String type) {
// List<CompilerAnnotation> compilerAnnotations = getAstDeclaration().getCompilerAnnotations();
throw new IllegalAccessError("Don't use a Source Class Mirror !");
}
@Override
public boolean isPublic() {
return getModelDeclaration().isShared();
}
@Override
public boolean isInterface() {
return getModelDeclaration() instanceof Interface;
}
@Override
public boolean isAbstract() {
Declaration decl = getModelDeclaration();
if (! (decl instanceof Class)) {
return false;
}
return ((Class) decl).isAbstract();
}
@Override
public boolean isProtected() {
return false;
}
@Override
public boolean isDefaultAccess() {
return false;
}
@Override
public boolean isStatic() {
return false;
}
@Override
public boolean isEnum() {
return false;
}
@Override
public boolean isFinal() {
Declaration decl = getModelDeclaration();
if (! (decl instanceof TypeDeclaration)) {
return false;
}
return ((TypeDeclaration)decl).isFinal();
}
@Override
public boolean isInnerClass() {
return getModelDeclaration().isClassOrInterfaceMember();
}
@Override
public boolean isAnonymous() {
return getModelDeclaration().isAnonymous();
}
@Override
public String getName() {
return getModelDeclaration().getName();
}
@Override
public String getQualifiedName() {
if(qualifiedName == null) {
String ceylonQualifiedName = getModelDeclaration().getQualifiedNameString();
if (ceylonQualifiedName != null){
qualifiedName = ceylonQualifiedName.replace("::", ".");
}
}
return qualifiedName;
}
@Override
public String getFlatName() {
if(flatName == null) {
String ceylonQualifiedName = getModelDeclaration().getQualifiedNameString();
if (ceylonQualifiedName != null) {
String[] packageAndDecl = ceylonQualifiedName.split("::");
String declName = packageAndDecl[packageAndDecl.length-1].replace('.', '$');
if (packageAndDecl.length > 1) {
flatName = packageAndDecl[0] + "." + declName;
} else {
flatName = declName;
}
}
}
return flatName;
}
@Override
public PackageMirror getPackage() {
Declaration decl = getModelDeclaration();
Scope scope = decl.getContainer();
while ((scope != null) && ! (scope instanceof Package)) {
scope = scope.getContainer();
}
final String fqn = scope == null ? "" : scope.getQualifiedNameString();
return new PackageMirror() {
@Override
public String getQualifiedName() {
return fqn;
}
};
}
@Override
public List<MethodMirror> getDirectMethods() {
System.out.println("!!!!!!!!!!!!!!!! In SourceClass.getDirectMethods() !!!!!!!!!!!!!!!!!!!!!!!");
throw new IllegalAccessError("Don't use a Source Class Mirror !");
// return Collections.emptyList();
// ClassOrInterface decl = (ClassOrInterface) getDeclarationModel();
// // ...
// if (decl instanceof Class) {
// Class clazz = (Class) decl;
// clazz.getParameterList();
// => On ajoute un MethodMirror pour le constructeur
// }
//
}
@Override
public List<FieldMirror> getDirectFields() {
System.out.println("!!!!!!!!!!!!!!!! In SourceClass.getDirectFields() !!!!!!!!!!!!!!!!!!!!!!!");
throw new IllegalAccessError("Don't use a Source Class Mirror !");
// return Collections.emptyList();
}
@Override
public List<TypeParameterMirror> getTypeParameters() {
System.out.println("!!!!!!!!!!!!!!!! In SourceClass.getTypeParameters() !!!!!!!!!!!!!!!!!!!!!!!");
throw new IllegalAccessError("Don't use a Source Class Mirror !");
// return Collections.emptyList();
}
@Override
public List<ClassMirror> getDirectInnerClasses() {
System.out.println("!!!!!!!!!!!!!!!! In SourceClass.getDirectInnerClasses() !!!!!!!!!!!!!!!!!!!!!!!");
throw new IllegalAccessError("Don't use a Source Class Mirror !");
// return Collections.emptyList();
}
@Override
public ClassMirror getEnclosingClass() {
System.out.println("!!!!!!!!!!!!!!!! In SourceClass.getEnclosingClass() !!!!!!!!!!!!!!!!!!!!!!!");
throw new IllegalAccessError("Don't use a Source Class Mirror !");
}
@Override
public MethodMirror getEnclosingMethod() {
System.out.println("!!!!!!!!!!!!!!!! In SourceClass.getEnclosingMethod() !!!!!!!!!!!!!!!!!!!!!!!");
throw new IllegalAccessError("Don't use a Source Class Mirror !");
}
@Override
public TypeMirror getSuperclass() {
System.out.println("!!!!!!!!!!!!!!!! In SourceClass.getSuperclass() !!!!!!!!!!!!!!!!!!!!!!!");
throw new IllegalAccessError("Don't use a Source Class Mirror !");
// return null;
}
@Override
public List<TypeMirror> getInterfaces() {
System.out.println("!!!!!!!!!!!!!!!! In SourceClass.getInterface() !!!!!!!!!!!!!!!!!!!!!!!");
throw new IllegalAccessError("Don't use a Source Class Mirror !");
// return Collections.emptyList();
}
@Override
public boolean isCeylonToplevelAttribute() {
return getAstDeclaration() instanceof Tree.AttributeDeclaration
&& getModelDeclaration().isToplevel();
}
@Override
public boolean isCeylonToplevelObject() {
return getAstDeclaration() instanceof Tree.ObjectDefinition
&& getModelDeclaration().isToplevel();
}
@Override
public boolean isCeylonToplevelMethod() {
return getAstDeclaration() instanceof Tree.MethodDefinition
&& getModelDeclaration().isToplevel();
}
public Declaration getModelDeclaration() {
return sourceDeclarationHolder.getModelDeclaration();
}
public Tree.Declaration getAstDeclaration() {
return sourceDeclarationHolder.getAstDeclaration();
}
@Override
public boolean isLoadedFromSource() {
return true;
}
@Override
public boolean isJavaSource() {
return false;
}
@Override
public boolean isAnnotationType() {
return false; // TODO : is it really right ?
}
@Override
public boolean isLocalClass() {
//TODO: is this correct!?
return !getModelDeclaration().isClassOrInterfaceMember() &&
!getModelDeclaration().isToplevel();
}
@Override
public String getCacheKey(Module module) {
if(cacheKey == null) {
String className = getQualifiedName();
cacheKey = AbstractModelLoader.getCacheKeyByModule(module, className);
}
return cacheKey;
}
}