@Override public Void visitClassTypeAlias(ClassTypeAlias node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); SimpleIdentifier className = node.getName(); ClassElementImpl element = new ClassElementImpl(className); element.setAbstract(node.getAbstractKeyword() != null); TypeVariableElement[] typeVariables = holder.getTypeVariables(); element.setTypeVariables(typeVariables); InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element); int typeVariableCount = typeVariables.length; Type[] typeArguments = new Type[typeVariableCount]; for (int i = 0; i < typeVariableCount; i++) { TypeVariableElementImpl typeVariable = (TypeVariableElementImpl) typeVariables[i]; TypeVariableTypeImpl typeArgument = new TypeVariableTypeImpl(typeVariable); typeVariable.setType(typeArgument); typeArguments[i] = typeArgument; } interfaceType.setTypeArguments(typeArguments); element.setType(interfaceType); currentHolder.addType(element); className.setElement(element); return null; }
public void test_isMoreSpecificThan_typeArguments_upperBound() { ClassElementImpl classS = classElement("A"); TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(identifier("T")); typeParameterT.setBound(classS.getType()); TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT); // <T extends S> // T << S assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.getType())); }
public void test_isMoreSpecificThan_typeArguments_transitivity_typeParameters() { ClassElementImpl classS = classElement("A"); TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(identifier("U")); typeParameterU.setBound(classS.getType()); TypeParameterTypeImpl typeParameterTypeU = new TypeParameterTypeImpl(typeParameterU); TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(identifier("T")); typeParameterT.setBound(typeParameterTypeU); TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT); // <T extends U> and <U extends S> // T << S assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.getType())); }
@Override public Void visitClassTypeAlias(ClassTypeAlias node) { ElementHolder holder = new ElementHolder(); functionTypesToFix = new ArrayList<FunctionTypeImpl>(); visitChildren(holder, node); SimpleIdentifier className = node.getName(); ClassElementImpl element = new ClassElementImpl(className); element.setAbstract(node.getAbstractKeyword() != null); element.setTypedef(true); TypeParameterElement[] typeParameters = holder.getTypeParameters(); element.setTypeParameters(typeParameters); Type[] typeArguments = createTypeParameterTypes(typeParameters); InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element); interfaceType.setTypeArguments(typeArguments); element.setType(interfaceType); // set default constructor element.setConstructors(createDefaultConstructors(interfaceType)); for (FunctionTypeImpl functionType : functionTypesToFix) { functionType.setTypeArguments(typeArguments); } functionTypesToFix = null; currentHolder.addType(element); className.setStaticElement(element); holder.validate(); return null; }
@Override public Void visitClassDeclaration(ClassDeclaration node) { ElementHolder holder = new ElementHolder(); isValidMixin = true; functionTypesToFix = new ArrayList<FunctionTypeImpl>(); visitChildren(holder, node); SimpleIdentifier className = node.getName(); ClassElementImpl element = new ClassElementImpl(className); TypeParameterElement[] typeParameters = holder.getTypeParameters(); Type[] typeArguments = createTypeParameterTypes(typeParameters); InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element); interfaceType.setTypeArguments(typeArguments); element.setType(interfaceType); ConstructorElement[] constructors = holder.getConstructors(); if (constructors.length == 0) { // // Create the default constructor. // constructors = createDefaultConstructors(interfaceType); } element.setAbstract(node.getAbstractKeyword() != null); element.setAccessors(holder.getAccessors()); element.setConstructors(constructors); element.setFields(holder.getFields()); element.setMethods(holder.getMethods()); element.setTypeParameters(typeParameters); element.setValidMixin(isValidMixin); int functionTypeCount = functionTypesToFix.size(); for (int i = 0; i < functionTypeCount; i++) { functionTypesToFix.get(i).setTypeArguments(typeArguments); } functionTypesToFix = null; currentHolder.addType(element); className.setStaticElement(element); holder.validate(); return null; }