Search in sources :

Example 51 with ParameterizedTypeRef

use of org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef in project n4js by eclipse.

the class N4JSASTUtils method getOwnOrSuperCtor.

private static TMember getOwnOrSuperCtor(final ContainerType<?> ownerOfField) {
    TClass klass = (TClass) (ownerOfField instanceof TClass ? ownerOfField : null);
    while (null != klass) {
        final TMember ctor = klass.findOwnedMember(CONSTRUCTOR);
        if (null != ctor) {
            return ctor;
        }
        final ParameterizedTypeRef superClassRef = klass.getSuperClassRef();
        if (null == superClassRef) {
            klass = null;
        } else {
            final Type declaredType = superClassRef.getDeclaredType();
            klass = (TClass) (declaredType instanceof TClass ? declaredType : null);
        }
    }
    return null;
}
Also used : ParameterizedTypeRef(org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef) ContainerType(org.eclipse.n4js.ts.types.ContainerType) Type(org.eclipse.n4js.ts.types.Type) TMember(org.eclipse.n4js.ts.types.TMember) TClass(org.eclipse.n4js.ts.types.TClass)

Example 52 with ParameterizedTypeRef

use of org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef in project n4js by eclipse.

the class N4JSMemberRedefinitionValidator method addIssueToMemberOrInterfaceReference.

private void addIssueToMemberOrInterfaceReference(RedefinitionType redefinitionType, TMember overriding, TMember implemented, String message, String issueCode, String... issueData) {
    if (redefinitionType == RedefinitionType.overridden && overriding.getContainingType() != getCurrentClassifier()) {
        throw new IllegalStateException("must not happen as member is not consumed");
    }
    TClassifier currentClassifier = getCurrentClassifier();
    if (overriding.getContainingType() == currentClassifier) {
        addIssue(message, overriding.getAstElement(), N4JSPackage.Literals.PROPERTY_NAME_OWNER__DECLARED_NAME, issueCode, issueData);
    } else {
        MemberCollector memberCollector = containerTypesHelper.fromContext(getCurrentClassifierDefinition());
        ContainerType<?> bequestingType = memberCollector.directSuperTypeBequestingMember(currentClassifier, implemented);
        Optional<ParameterizedTypeRef> optRef = StreamSupport.stream(getCurrentClassifierDefinition().getImplementedOrExtendedInterfaceRefs().spliterator(), false).filter(ref -> ref.getDeclaredType() == bequestingType).findAny();
        ParameterizedTypeRef ref = optRef.get();
        EStructuralFeature feature = ref.eContainingFeature();
        List<?> list = (List<?>) getCurrentClassifierDefinition().eGet(feature);
        int index = list.indexOf(ref);
        addIssue(message, getCurrentClassifierDefinition(), feature, index, issueCode, issueData);
    }
}
Also used : TClassifier(org.eclipse.n4js.ts.types.TClassifier) ParameterizedTypeRef(org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef) IssueCodes.getMessageForCLF_REDEFINED_NON_ACCESSIBLE(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_REDEFINED_NON_ACCESSIBLE) CLF_CONSUMED_INHERITED_MEMBER_UNSOLVABLE_CONFLICT(org.eclipse.n4js.validation.IssueCodes.CLF_CONSUMED_INHERITED_MEMBER_UNSOLVABLE_CONFLICT) TClass(org.eclipse.n4js.ts.types.TClass) ParameterizedTypeRef(org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef) IssueCodes.getMessageForCLF_OVERRIDE_FINAL(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_FINAL) TSetter(org.eclipse.n4js.ts.types.TSetter) IssueCodes.getMessageForCLF_IMPLEMENT_MEMBERTYPE_INCOMPATIBLE(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_IMPLEMENT_MEMBERTYPE_INCOMPATIBLE) IssueCodes.getMessageForCLF_MISSING_IMPLEMENTATION(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_MISSING_IMPLEMENTATION) IssueCodes.getMessageForCLF_OVERRIDE_VISIBILITY(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_VISIBILITY) Type(org.eclipse.n4js.ts.types.Type) IssueCodes.getMessageForCLF_OVERRIDE_CONST(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_CONST) Map(java.util.Map) CLF_PSEUDO_REDEFINED_SPEC_CTOR_INCOMPATIBLE(org.eclipse.n4js.validation.IssueCodes.CLF_PSEUDO_REDEFINED_SPEC_CTOR_INCOMPATIBLE) IssueUserDataKeys(org.eclipse.n4js.validation.IssueUserDataKeys) Check(org.eclipse.xtext.validation.Check) CLF_CONSUMED_FIELD_ACCESSOR_PAIR_INCOMPLETE(org.eclipse.n4js.validation.IssueCodes.CLF_CONSUMED_FIELD_ACCESSOR_PAIR_INCOMPLETE) CLF_OVERRIDE_ANNOTATION(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_ANNOTATION) CLF_OVERRIDE_MEMBERTYPE_INCOMPATIBLE(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_MEMBERTYPE_INCOMPATIBLE) IssueCodes.getMessageForCLF_OVERRIDE_WITH_FINAL_OR_CONST_FIELD(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_WITH_FINAL_OR_CONST_FIELD) CLF_REDEFINED_TYPE_NOT_SAME_TYPE(org.eclipse.n4js.validation.IssueCodes.CLF_REDEFINED_TYPE_NOT_SAME_TYPE) IssueCodes.getMessageForCLF_OVERRIDE_FIELD_REQUIRES_ACCESSOR_PAIR(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_FIELD_REQUIRES_ACCESSOR_PAIR) CLF_NON_ACCESSIBLE_ABSTRACT_MEMBERS(org.eclipse.n4js.validation.IssueCodes.CLF_NON_ACCESSIBLE_ABSTRACT_MEMBERS) Set(java.util.Set) CLF_REDEFINED_METHOD_TYPE_CONFLICT(org.eclipse.n4js.validation.IssueCodes.CLF_REDEFINED_METHOD_TYPE_CONFLICT) CLF_IMPLEMENT_MEMBERTYPE_INCOMPATIBLE(org.eclipse.n4js.validation.IssueCodes.CLF_IMPLEMENT_MEMBERTYPE_INCOMPATIBLE) N4ClassifierDefinition(org.eclipse.n4js.n4JS.N4ClassifierDefinition) MethodDeclaration(org.eclipse.n4js.n4JS.MethodDeclaration) CLF_OVERRIDE_FINAL(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_FINAL) Iterables(com.google.common.collect.Iterables) MemberType(org.eclipse.n4js.ts.types.MemberType) MemberAccessModifier(org.eclipse.n4js.ts.types.MemberAccessModifier) IssueCodes.getMessageForCLF_OVERRIDEN_CONCRETE_WITH_ABSTRACT(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDEN_CONCRETE_WITH_ABSTRACT) TypeUtils(org.eclipse.n4js.ts.utils.TypeUtils) ArrayList(java.util.ArrayList) TModule(org.eclipse.n4js.ts.types.TModule) TypeSystemHelper(org.eclipse.n4js.typesystem.TypeSystemHelper) RuleEnvironmentExtensions(org.eclipse.n4js.typesystem.RuleEnvironmentExtensions) TInterface(org.eclipse.n4js.ts.types.TInterface) MemberMatrix(org.eclipse.n4js.validation.validators.utils.MemberMatrix) IssueCodes.getMessageForCLF_OVERRIDE_NON_EXISTENT(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_NON_EXISTENT) MemberVisibilityChecker(org.eclipse.n4js.scoping.accessModifiers.MemberVisibilityChecker) AbstractN4JSDeclarativeValidator(org.eclipse.n4js.validation.AbstractN4JSDeclarativeValidator) StreamSupport(java.util.stream.StreamSupport) CLF_OVERRIDE_NON_EXISTENT(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_NON_EXISTENT) IssueCodes.getMessageForCLF_OVERRIDE_MEMBERTYPE_INCOMPATIBLE(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_MEMBERTYPE_INCOMPATIBLE) N4JSLanguageUtils(org.eclipse.n4js.utils.N4JSLanguageUtils) EcoreUtil(org.eclipse.emf.ecore.util.EcoreUtil) NameStaticPair(org.eclipse.n4js.ts.types.util.NameStaticPair) FunctionTypeExprOrRef(org.eclipse.n4js.ts.typeRefs.FunctionTypeExprOrRef) IssueCodes.getMessageForCLF_OVERRIDE_NON_EXISTENT_INTERFACE(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_NON_EXISTENT_INTERFACE) N4JSTypeSystem(org.eclipse.n4js.typesystem.N4JSTypeSystem) FunctionTypeExpression(org.eclipse.n4js.ts.typeRefs.FunctionTypeExpression) IssueCodes.getMessageForCLF_UNMATCHED_ACCESSOR_OVERRIDE(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_UNMATCHED_ACCESSOR_OVERRIDE) IssueCodes.getMessageForCLF_NON_ACCESSIBLE_ABSTRACT_MEMBERS(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_NON_ACCESSIBLE_ABSTRACT_MEMBERS) Arrays(org.eclipse.xtext.util.Arrays) RuleEnvironment(org.eclipse.xsemantics.runtime.RuleEnvironment) SourceAwareIterator(org.eclipse.n4js.validation.validators.utils.MemberMatrix.SourceAwareIterator) Inject(com.google.inject.Inject) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) ContainerType(org.eclipse.n4js.ts.types.ContainerType) IssueCodes.getMessageForCLF_REDEFINED_MEMBER_TYPE_INVALID(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_REDEFINED_MEMBER_TYPE_INVALID) IssueCodes.getMessageForCLF_OVERRIDE_ANNOTATION(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_OVERRIDE_ANNOTATION) CLF_OVERRIDE_FIELD_REQUIRES_ACCESSOR_PAIR(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_FIELD_REQUIRES_ACCESSOR_PAIR) CLF_MISSING_IMPLEMENTATION(org.eclipse.n4js.validation.IssueCodes.CLF_MISSING_IMPLEMENTATION) CLF_OVERRIDE_VISIBILITY(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_VISIBILITY) MemberList(org.eclipse.n4js.ts.types.util.MemberList) N4InterfaceDeclaration(org.eclipse.n4js.n4JS.N4InterfaceDeclaration) TypeRef(org.eclipse.n4js.ts.typeRefs.TypeRef) N4ClassDefinition(org.eclipse.n4js.n4JS.N4ClassDefinition) IssueCodes.getMessageForCLF_CONSUMED_FIELD_ACCESSOR_PAIR_INCOMPLETE(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_CONSUMED_FIELD_ACCESSOR_PAIR_INCOMPLETE) TField(org.eclipse.n4js.ts.types.TField) Collection(java.util.Collection) IssueCodes.getMessageForCLF_MISSING_IMPLEMENTATION_EXT(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_MISSING_IMPLEMENTATION_EXT) JavaScriptVariantHelper(org.eclipse.n4js.validation.JavaScriptVariantHelper) IssueCodes.getMessageForCLF_PSEUDO_REDEFINED_SPEC_CTOR_INCOMPATIBLE(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_PSEUDO_REDEFINED_SPEC_CTOR_INCOMPATIBLE) EObject(org.eclipse.emf.ecore.EObject) TMethod(org.eclipse.n4js.ts.types.TMethod) Collectors(java.util.stream.Collectors) List(java.util.List) TClassifier(org.eclipse.n4js.ts.types.TClassifier) IssueCodes.getMessageForCLF_UNMATCHED_ACCESSOR_OVERRIDE_JS(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_UNMATCHED_ACCESSOR_OVERRIDE_JS) Entry(java.util.Map.Entry) Resource(org.eclipse.emf.ecore.resource.Resource) CLF_OVERRIDE_CONST(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_CONST) Optional(java.util.Optional) MemberRedefinitionUtils(org.eclipse.n4js.validation.validators.utils.MemberRedefinitionUtils) IssueCodes.getMessageForCLF_REDEFINED_TYPE_NOT_SAME_TYPE(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_REDEFINED_TYPE_NOT_SAME_TYPE) HashMap(java.util.HashMap) N4JSPackage(org.eclipse.n4js.n4JS.N4JSPackage) CLF_OVERRIDE_NON_EXISTENT_INTERFACE(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_NON_EXISTENT_INTERFACE) CLF_UNMATCHED_ACCESSOR_OVERRIDE(org.eclipse.n4js.validation.IssueCodes.CLF_UNMATCHED_ACCESSOR_OVERRIDE) FieldAccessor(org.eclipse.n4js.ts.types.FieldAccessor) Iterators(com.google.common.collect.Iterators) HashSet(java.util.HashSet) IssueCodes.getMessageForCLF_CONSUMED_MEMBER_SOLVABLE_CONFLICT(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_CONSUMED_MEMBER_SOLVABLE_CONFLICT) ContainerTypesHelper(org.eclipse.n4js.utils.ContainerTypesHelper) EcoreUtil2(org.eclipse.xtext.EcoreUtil2) IssueCodes.getMessageForCLF_REDEFINED_METHOD_TYPE_CONFLICT(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_REDEFINED_METHOD_TYPE_CONFLICT) CLF_MISSING_IMPLEMENTATION_EXT(org.eclipse.n4js.validation.IssueCodes.CLF_MISSING_IMPLEMENTATION_EXT) MemberCube(org.eclipse.n4js.validation.validators.utils.MemberCube) MemberCollector(org.eclipse.n4js.utils.ContainerTypesHelper.MemberCollector) IssueCodes.getMessageForCLF_CONSUMED_MEMBER_UNSOLVABLE_CONFLICT(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_CONSUMED_MEMBER_UNSOLVABLE_CONFLICT) CLF_OVERRIDEN_CONCRETE_WITH_ABSTRACT(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDEN_CONCRETE_WITH_ABSTRACT) Result(org.eclipse.xsemantics.runtime.Result) TMember(org.eclipse.n4js.ts.types.TMember) CLF_CONSUMED_MEMBER_UNSOLVABLE_CONFLICT(org.eclipse.n4js.validation.IssueCodes.CLF_CONSUMED_MEMBER_UNSOLVABLE_CONFLICT) IssueCodes.getMessageForCLF_CONSUMED_INHERITED_MEMBER_UNSOLVABLE_CONFLICT(org.eclipse.n4js.validation.IssueCodes.getMessageForCLF_CONSUMED_INHERITED_MEMBER_UNSOLVABLE_CONFLICT) CLF_REDEFINED_MEMBER_TYPE_INVALID(org.eclipse.n4js.validation.IssueCodes.CLF_REDEFINED_MEMBER_TYPE_INVALID) CLF_OVERRIDE_WITH_FINAL_OR_CONST_FIELD(org.eclipse.n4js.validation.IssueCodes.CLF_OVERRIDE_WITH_FINAL_OR_CONST_FIELD) AccessModifiers(org.eclipse.n4js.ts.types.util.AccessModifiers) CLF_CONSUMED_MEMBER_SOLVABLE_CONFLICT(org.eclipse.n4js.validation.IssueCodes.CLF_CONSUMED_MEMBER_SOLVABLE_CONFLICT) CLF_REDEFINED_NON_ACCESSIBLE(org.eclipse.n4js.validation.IssueCodes.CLF_REDEFINED_NON_ACCESSIBLE) EValidatorRegistrar(org.eclipse.xtext.validation.EValidatorRegistrar) CLF_UNMATCHED_ACCESSOR_OVERRIDE_JS(org.eclipse.n4js.validation.IssueCodes.CLF_UNMATCHED_ACCESSOR_OVERRIDE_JS) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) ArrayList(java.util.ArrayList) MemberList(org.eclipse.n4js.ts.types.util.MemberList) List(java.util.List) MemberCollector(org.eclipse.n4js.utils.ContainerTypesHelper.MemberCollector)

Example 53 with ParameterizedTypeRef

use of org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef in project n4js by eclipse.

the class N4JSMemberRedefinitionValidator method constraints_42_45_46_AbstractMember.

/**
 * Constraints 42, 3 (Abstract Member)<br>
 * Constraints 45, 4 (Extending Interfaces)<br>
 * Constraints 46, 5 (Implementing Interfaces)
 *
 * This method doesn't add issues for missing override annotations but adds the missing-annotation-members to the
 * given collection.
 */
private void constraints_42_45_46_AbstractMember(MemberMatrix mm, Map<ParameterizedTypeRef, MemberList<TMember>> nonAccessibleAbstractMembersBySuperTypeRef) {
    N4ClassifierDefinition classifierDefinition = getCurrentClassifierDefinition();
    TClassifier classifier = getCurrentClassifier();
    TModule contextModule = EcoreUtil2.getContainerOfType(classifier, TModule.class);
    for (SourceAwareIterator iter = mm.allMembers(); iter.hasNext(); ) {
        TMember m = iter.next();
        if (!iter.isOwnedMember() && m.isAbstract()) {
            if (!memberVisibilityChecker.isVisibleWhenOverriding(contextModule, classifier, classifier, m)) {
                Iterable<ParameterizedTypeRef> superTypeRefs = FindClassifierInHierarchyUtils.findSuperTypesWithMember(classifierDefinition, m);
                for (ParameterizedTypeRef superTypeRef : superTypeRefs) {
                    MemberList<TMember> nonAccessible = nonAccessibleAbstractMembersBySuperTypeRef.get(superTypeRef);
                    if (nonAccessible == null) {
                        nonAccessible = new MemberList<>();
                        nonAccessibleAbstractMembersBySuperTypeRef.put(superTypeRef, nonAccessible);
                    }
                    nonAccessible.add(m);
                }
            }
        }
    }
}
Also used : TClassifier(org.eclipse.n4js.ts.types.TClassifier) ParameterizedTypeRef(org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef) N4ClassifierDefinition(org.eclipse.n4js.n4JS.N4ClassifierDefinition) SourceAwareIterator(org.eclipse.n4js.validation.validators.utils.MemberMatrix.SourceAwareIterator) TModule(org.eclipse.n4js.ts.types.TModule) TMember(org.eclipse.n4js.ts.types.TMember)

Example 54 with ParameterizedTypeRef

use of org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef in project n4js by eclipse.

the class N4JSMemberRedefinitionValidator method checkMemberRedefinitions.

/**
 * Checks constraints defined in chapter 5.4. Redefinition of Members.
 */
@Check
public void checkMemberRedefinitions(N4ClassifierDefinition n4ClassifierDefinition) {
    if (!(n4ClassifierDefinition.getDefinedType() instanceof TClassifier)) {
        // wrongly parsed
        return;
    }
    TClassifier tClassifier = (TClassifier) n4ClassifierDefinition.getDefinedType();
    getContext().put(TClassifier.class, tClassifier);
    RuleEnvironment g = RuleEnvironmentExtensions.newRuleEnvironment(tClassifier);
    getContext().put(RuleEnvironment.class, g);
    // the context for type variables
    ParameterizedTypeRef classTypeRef = TypeUtils.createTypeRef(tClassifier);
    getContext().put(TYPE_VAR_CONTEXT, classTypeRef);
    MemberCube memberCube = createMemberValidationList();
    final boolean isClass = tClassifier instanceof TClass;
    final Map<ParameterizedTypeRef, MemberList<TMember>> nonAccessibleAbstractMembersBySuperTypeRef = new HashMap<>();
    for (Entry<NameStaticPair, MemberMatrix> entry : memberCube.entrySet()) {
        MemberMatrix mm = entry.getValue();
        // Set to collect all owned members that are lacking an override annotation.
        Collection<TMember> membersMissingOverrideAnnotation = new HashSet<>();
        if (isClass) {
            constraints_67_MemberOverride_checkEntry(mm, membersMissingOverrideAnnotation);
        }
        if (mm.hasImplemented()) {
            // first mix in
            if (holdConstraints_68_Consumption(mm)) {
                // then check if everything is implemented
                constraints_69_Implementation(mm, membersMissingOverrideAnnotation);
            }
        }
        constraints_60_InheritedConsumedCovariantSpecConstructor(tClassifier, mm);
        constraints_66_NonOverride(mm);
        constraints_42_45_46_AbstractMember(mm, nonAccessibleAbstractMembersBySuperTypeRef);
        unusedGenericTypeVariable(mm);
        checkUnpairedAccessorConsumption(mm, n4ClassifierDefinition);
        checkUnpairedAccessorFilling(mm, n4ClassifierDefinition);
        messageMissingOverrideAnnotation(mm, membersMissingOverrideAnnotation);
    }
    final boolean foundImpossibleExtendsImplements = !nonAccessibleAbstractMembersBySuperTypeRef.isEmpty();
    if (foundImpossibleExtendsImplements) {
        messageImpossibleExtendsImplements(n4ClassifierDefinition, nonAccessibleAbstractMembersBySuperTypeRef);
    }
    if (!foundImpossibleExtendsImplements) {
        // avoid consequential errors
        constraints_41_AbstractClass(tClassifier, memberCube);
    }
}
Also used : TClassifier(org.eclipse.n4js.ts.types.TClassifier) NameStaticPair(org.eclipse.n4js.ts.types.util.NameStaticPair) MemberList(org.eclipse.n4js.ts.types.util.MemberList) HashMap(java.util.HashMap) MemberMatrix(org.eclipse.n4js.validation.validators.utils.MemberMatrix) ParameterizedTypeRef(org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef) MemberCube(org.eclipse.n4js.validation.validators.utils.MemberCube) RuleEnvironment(org.eclipse.xsemantics.runtime.RuleEnvironment) TMember(org.eclipse.n4js.ts.types.TMember) TClass(org.eclipse.n4js.ts.types.TClass) HashSet(java.util.HashSet) Check(org.eclipse.xtext.validation.Check)

Example 55 with ParameterizedTypeRef

use of org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef in project n4js by eclipse.

the class N4JSSyntaxValidator method checkInterfaceDeclaration.

/**
 * Checks that no "with" or "role" is used and that list of implemented interfaces is separated with commas and not
 * with keywords. These checks (with some warnings created instead of errors) should help the transition from roles
 * to interfaces. However, they may be useful later on as well, e.g., if an interface is manually refactored into a
 * class or vice versa.
 * <p>
 * Note that "with" is used in Dart for roles, so maybe it is useful to have a user-friendly message instead of a
 * parser error.
 * <p>
 * "role" will be removed in grammar.
 */
@Check
public void checkInterfaceDeclaration(N4InterfaceDeclaration n4InterfaceDecl) {
    ICompositeNode node = NodeModelUtils.findActualNodeFor(n4InterfaceDecl);
    ILeafNode keywordNode;
    keywordNode = findLeafWithKeyword(n4InterfaceDecl, "{", node, IMPLEMENTS_KEYWORD, false);
    if (keywordNode != null) {
        TInterface tinterface = n4InterfaceDecl.getDefinedTypeAsInterface();
        if (tinterface == null) {
            // avoid consequential errors
            return;
        }
        if (tinterface.getSuperInterfaceRefs().isEmpty()) {
            // ok
            return;
        }
        if (tinterface.getSuperInterfaceRefs().stream().allMatch(superTypeRef -> superTypeRef.getDeclaredType() instanceof TInterface)) {
            List<? extends IdentifiableElement> interfaces = tinterface.getSuperInterfaceRefs().stream().flatMap((ParameterizedTypeRef ref) -> {
                Type declaredType = ref.getDeclaredType();
                if (declaredType instanceof TInterface) {
                    return Stream.of((TInterface) declaredType);
                }
                return Stream.empty();
            }).collect(Collectors.toList());
            String message = getMessageForSYN_KW_EXTENDS_IMPLEMENTS_MIXED_UP(validatorMessageHelper.description(tinterface), "implement", "interface" + (interfaces.size() > 1 ? "s " : " ") + validatorMessageHelper.names(interfaces), EXTENDS_KEYWORD);
            addIssue(message, n4InterfaceDecl, keywordNode.getTotalOffset(), keywordNode.getLength(), SYN_KW_EXTENDS_IMPLEMENTS_MIXED_UP);
        }
    }
}
Also used : ParameterizedTypeRef(org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef) Type(org.eclipse.n4js.ts.types.Type) ILeafNode(org.eclipse.xtext.nodemodel.ILeafNode) TInterface(org.eclipse.n4js.ts.types.TInterface) ICompositeNode(org.eclipse.xtext.nodemodel.ICompositeNode) Check(org.eclipse.xtext.validation.Check)

Aggregations

ParameterizedTypeRef (org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef)80 TypeTypeRef (org.eclipse.n4js.ts.typeRefs.TypeTypeRef)48 TypeRef (org.eclipse.n4js.ts.typeRefs.TypeRef)47 BoundThisTypeRef (org.eclipse.n4js.ts.typeRefs.BoundThisTypeRef)45 ComposedTypeRef (org.eclipse.n4js.ts.typeRefs.ComposedTypeRef)44 ExistentialTypeRef (org.eclipse.n4js.ts.typeRefs.ExistentialTypeRef)44 StructuralTypeRef (org.eclipse.n4js.ts.typeRefs.StructuralTypeRef)44 BaseTypeRef (org.eclipse.n4js.ts.typeRefs.BaseTypeRef)42 FunctionTypeRef (org.eclipse.n4js.ts.typeRefs.FunctionTypeRef)42 ThisTypeRef (org.eclipse.n4js.ts.typeRefs.ThisTypeRef)42 UnknownTypeRef (org.eclipse.n4js.ts.typeRefs.UnknownTypeRef)42 StaticBaseTypeRef (org.eclipse.n4js.ts.typeRefs.StaticBaseTypeRef)41 RuleFailedException (org.eclipse.xsemantics.runtime.RuleFailedException)32 EObject (org.eclipse.emf.ecore.EObject)30 ErrorInformation (org.eclipse.xsemantics.runtime.ErrorInformation)23 Result (org.eclipse.xsemantics.runtime.Result)23 StructuralTypingResult (org.eclipse.n4js.typesystem.StructuralTypingResult)22 Type (org.eclipse.n4js.ts.types.Type)21 RuleApplicationTrace (org.eclipse.xsemantics.runtime.RuleApplicationTrace)21 ContainerType (org.eclipse.n4js.ts.types.ContainerType)17