use of org.eclipse.n4js.ts.types.TMethod in project n4js by eclipse.
the class N4JSMemberRedefinitionValidator method unusedGenericTypeVariable.
/**
* GHOLD-234 add warning for unused type variables in function and method declarations (unless the method overrides
* any other method).
*/
private void unusedGenericTypeVariable(MemberMatrix mm) {
for (TMember member : mm.owned()) {
if (member instanceof TMethod) {
TMethod method = (TMethod) member;
if (!mm.hasInherited() && !mm.hasImplemented()) {
// We need the method declaration from the AST in order to pass it to the internal
// validation function. This is necessary because we want to attach the warning to the actual unused
// type variable in the method declaration, and the type variable in the type model is not identical
// to the one in the AST which we actually need.
// Since method is owned by the type being validated, we can safely navigate back from the type
// model to the AST without triggering another parse.
MethodDeclaration methodDeclaration = (MethodDeclaration) method.getAstElement();
internalCheckNoUnusedTypeParameters(methodDeclaration);
}
}
}
}
use of org.eclipse.n4js.ts.types.TMethod in project n4js by eclipse.
the class InternalTypeSystem method applyRuleSubtypeTypeTypeRef.
protected Result<Boolean> applyRuleSubtypeTypeTypeRef(final RuleEnvironment G, final RuleApplicationTrace _trace_, final TypeTypeRef left, final TypeTypeRef right) throws RuleFailedException {
final TypeArgument leftTypeArg = left.getTypeArg();
final TypeArgument rightTypeArg = right.getTypeArg();
final boolean leftIsCtorRef = left.isConstructorRef();
final boolean rightIsCtorRef = right.isConstructorRef();
final boolean rightHasTypeRef = (rightTypeArg instanceof TypeRef);
if (((!leftIsCtorRef) && rightIsCtorRef)) {
/* fail */
throwForExplicitFail();
} else {
if ((rightHasTypeRef && (!rightIsCtorRef))) {
/* G |- leftTypeArg <: rightTypeArg */
subtypeInternal(G, _trace_, leftTypeArg, rightTypeArg);
} else {
if ((rightHasTypeRef && rightIsCtorRef)) {
final Type left_staticType = this.typeSystemHelper.getStaticType(G, left);
final Type right_staticType = this.typeSystemHelper.getStaticType(G, right);
final boolean leftHasCovariantConstructor = ((left_staticType instanceof TClassifier) && N4JSLanguageUtils.hasCovariantConstructor(((TClassifier) left_staticType)));
/* !(leftTypeArg instanceof Wildcard || leftTypeArg instanceof ExistentialTypeRef || leftTypeArg instanceof ThisTypeRef) || leftHasCovariantConstructor */
if (!((!(((leftTypeArg instanceof Wildcard) || (leftTypeArg instanceof ExistentialTypeRef)) || (leftTypeArg instanceof ThisTypeRef))) || leftHasCovariantConstructor)) {
sneakyThrowRuleFailedException("!(leftTypeArg instanceof Wildcard || leftTypeArg instanceof ExistentialTypeRef || leftTypeArg instanceof ThisTypeRef) || leftHasCovariantConstructor");
}
/* G |- leftTypeArg <: rightTypeArg */
subtypeInternal(G, _trace_, leftTypeArg, rightTypeArg);
if (((left_staticType instanceof TypeVariable) || (right_staticType instanceof TypeVariable))) {
/* left_staticType === right_staticType */
if (!(left_staticType == right_staticType)) {
sneakyThrowRuleFailedException("left_staticType === right_staticType");
}
} else {
final TMethod leftCtor = this.containerTypesHelper.fromContext(RuleEnvironmentExtensions.getContextResource(G)).findConstructor(((ContainerType<?>) left_staticType));
final TMethod rightCtor = this.containerTypesHelper.fromContext(RuleEnvironmentExtensions.getContextResource(G)).findConstructor(((ContainerType<?>) right_staticType));
/* leftCtor!==null && rightCtor!==null */
if (!((leftCtor != null) && (rightCtor != null))) {
sneakyThrowRuleFailedException("leftCtor!==null && rightCtor!==null");
}
/* G |- leftCtor : var TypeRef leftCtorRef */
TypeRef leftCtorRef = null;
Result<TypeRef> result = typeInternal(G, _trace_, leftCtor);
checkAssignableTo(result.getFirst(), TypeRef.class);
leftCtorRef = (TypeRef) result.getFirst();
/* G |- rightCtor : var TypeRef rightCtorRef */
TypeRef rightCtorRef = null;
Result<TypeRef> result_1 = typeInternal(G, _trace_, rightCtor);
checkAssignableTo(result_1.getFirst(), TypeRef.class);
rightCtorRef = (TypeRef) result_1.getFirst();
final RuleEnvironment G_left = RuleEnvironmentExtensions.wrap(G);
final RuleEnvironment G_right = RuleEnvironmentExtensions.wrap(G);
this.typeSystemHelper.addSubstitutions(G_left, TypeExtensions.ref(left_staticType));
RuleEnvironmentExtensions.addThisType(G_left, TypeExtensions.ref(left_staticType));
this.typeSystemHelper.addSubstitutions(G_right, TypeExtensions.ref(right_staticType));
RuleEnvironmentExtensions.addThisType(G_right, TypeExtensions.ref(right_staticType));
/* G_left |- leftCtorRef ~> var TypeRef leftCtorRefSubst */
TypeRef leftCtorRefSubst = null;
Result<TypeArgument> result_2 = substTypeVariablesInternal(G_left, _trace_, leftCtorRef);
checkAssignableTo(result_2.getFirst(), TypeRef.class);
leftCtorRefSubst = (TypeRef) result_2.getFirst();
/* G_right |- rightCtorRef ~> var TypeRef rightCtorRefSubst */
TypeRef rightCtorRefSubst = null;
Result<TypeArgument> result_3 = substTypeVariablesInternal(G_right, _trace_, rightCtorRef);
checkAssignableTo(result_3.getFirst(), TypeRef.class);
rightCtorRefSubst = (TypeRef) result_3.getFirst();
/* G |- leftCtorRefSubst <: rightCtorRefSubst */
subtypeInternal(G, _trace_, leftCtorRefSubst, rightCtorRefSubst);
}
} else {
/* G |~ leftTypeArg /\ var TypeRef upperBoundLeft */
TypeRef upperBoundLeft = null;
Result<TypeRef> result_4 = upperBoundInternal(G, _trace_, leftTypeArg);
checkAssignableTo(result_4.getFirst(), TypeRef.class);
upperBoundLeft = (TypeRef) result_4.getFirst();
/* G |~ leftTypeArg \/ var TypeRef lowerBoundLeft */
TypeRef lowerBoundLeft = null;
Result<TypeRef> result_5 = lowerBoundInternal(G, _trace_, leftTypeArg);
checkAssignableTo(result_5.getFirst(), TypeRef.class);
lowerBoundLeft = (TypeRef) result_5.getFirst();
/* G |~ rightTypeArg /\ var TypeRef upperBoundRight */
TypeRef upperBoundRight = null;
Result<TypeRef> result_6 = upperBoundInternal(G, _trace_, rightTypeArg);
checkAssignableTo(result_6.getFirst(), TypeRef.class);
upperBoundRight = (TypeRef) result_6.getFirst();
/* G |~ rightTypeArg \/ var TypeRef lowerBoundRight */
TypeRef lowerBoundRight = null;
Result<TypeRef> result_7 = lowerBoundInternal(G, _trace_, rightTypeArg);
checkAssignableTo(result_7.getFirst(), TypeRef.class);
lowerBoundRight = (TypeRef) result_7.getFirst();
/* G |- upperBoundLeft <: upperBoundRight */
subtypeInternal(G, _trace_, upperBoundLeft, upperBoundRight);
/* G |- lowerBoundRight <: lowerBoundLeft */
subtypeInternal(G, _trace_, lowerBoundRight, lowerBoundLeft);
}
}
}
return new Result<Boolean>(true);
}
use of org.eclipse.n4js.ts.types.TMethod in project n4js by eclipse.
the class InternalTypeSystem method applyRuleTypeIdentifierRef.
protected Result<TypeRef> applyRuleTypeIdentifierRef(final RuleEnvironment G, final RuleApplicationTrace _trace_, final IdentifierRef idref) throws RuleFailedException {
// output parameter
TypeRef T = null;
/* G |- idref.id : T */
IdentifiableElement _id = idref.getId();
Result<TypeRef> result = typeInternal(G, _trace_, _id);
checkAssignableTo(result.getFirst(), TypeRef.class);
T = (TypeRef) result.getFirst();
T = this.versionResolver.<TypeRef, IdentifierRef>resolveVersion(T, idref);
if (((idref.eContainer() instanceof ParameterizedCallExpression) && (idref.eContainmentFeature() == N4JSPackage.eINSTANCE.getParameterizedCallExpression_Target()))) {
final TMethod callableCtorFunction = this.typeSystemHelper.getCallableClassConstructorFunction(G, T);
if ((callableCtorFunction != null)) {
T = TypeExtensions.ref(callableCtorFunction);
}
}
return new Result<TypeRef>(T);
}
use of org.eclipse.n4js.ts.types.TMethod in project n4js by eclipse.
the class InternalTypeSystem method applyRuleTypeSuperLiteral.
protected Result<TypeRef> applyRuleTypeSuperLiteral(final RuleEnvironment G, final RuleApplicationTrace _trace_, final SuperLiteral superLiteral) throws RuleFailedException {
// output parameter
TypeRef T = null;
final N4MemberDeclaration containingMemberDecl = EcoreUtil2.<N4MemberDeclaration>getContainerOfType(superLiteral.eContainer(), N4MemberDeclaration.class);
/* if (containingMemberDecl === null) { T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } else { val containingClass = (containingMemberDecl.eContainer as N4ClassDeclaration).definedType as TClass; val superClass = G.getDeclaredOrImplicitSuperType(containingClass) var effectiveSuperClass = superClass if( containingClass.isStaticPolyfill ) { effectiveSuperClass = G.getDeclaredOrImplicitSuperType( superClass as TClass ) } { superLiteral.eContainer instanceof ParameterizedPropertyAccessExpression || superLiteral.eContainer instanceof IndexedAccessExpression if(containingMemberDecl.static) T = effectiveSuperClass?.createConstructorTypeRef else T = effectiveSuperClass?.createTypeRef if (T !== null) T = TypeUtils.enforceNominalTyping(T) } or { superLiteral.eContainer instanceof ParameterizedCallExpression if(containingMemberDecl instanceof N4MethodDeclaration && containingMemberDecl.name == 'constructor') { val ctor = containerTypesHelper.fromContext(superLiteral.eResource).findConstructor(effectiveSuperClass); T = ctor?.createTypeRef } else { T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } } or { superLiteral.eContainer instanceof NewExpression } } or { T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } */
{
RuleFailedException previousFailure = null;
try {
if ((containingMemberDecl == null)) {
T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef();
} else {
EObject _eContainer = containingMemberDecl.eContainer();
Type _definedType = ((N4ClassDeclaration) _eContainer).getDefinedType();
final TClass containingClass = ((TClass) _definedType);
final TClassifier superClass = RuleEnvironmentExtensions.getDeclaredOrImplicitSuperType(G, containingClass);
TClassifier effectiveSuperClass = superClass;
boolean _isStaticPolyfill = containingClass.isStaticPolyfill();
if (_isStaticPolyfill) {
effectiveSuperClass = RuleEnvironmentExtensions.getDeclaredOrImplicitSuperType(G, ((TClass) superClass));
}
/* { superLiteral.eContainer instanceof ParameterizedPropertyAccessExpression || superLiteral.eContainer instanceof IndexedAccessExpression if(containingMemberDecl.static) T = effectiveSuperClass?.createConstructorTypeRef else T = effectiveSuperClass?.createTypeRef if (T !== null) T = TypeUtils.enforceNominalTyping(T) } or { superLiteral.eContainer instanceof ParameterizedCallExpression if(containingMemberDecl instanceof N4MethodDeclaration && containingMemberDecl.name == 'constructor') { val ctor = containerTypesHelper.fromContext(superLiteral.eResource).findConstructor(effectiveSuperClass); T = ctor?.createTypeRef } else { T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } } or { superLiteral.eContainer instanceof NewExpression } */
{
try {
/* superLiteral.eContainer instanceof ParameterizedPropertyAccessExpression || superLiteral.eContainer instanceof IndexedAccessExpression */
if (!((superLiteral.eContainer() instanceof ParameterizedPropertyAccessExpression) || (superLiteral.eContainer() instanceof IndexedAccessExpression))) {
sneakyThrowRuleFailedException("superLiteral.eContainer instanceof ParameterizedPropertyAccessExpression || superLiteral.eContainer instanceof IndexedAccessExpression");
}
boolean _isStatic = containingMemberDecl.isStatic();
if (_isStatic) {
TypeRef _createConstructorTypeRef = null;
if (effectiveSuperClass != null) {
_createConstructorTypeRef = TypeUtils.createConstructorTypeRef(effectiveSuperClass);
}
T = _createConstructorTypeRef;
} else {
ParameterizedTypeRef _createTypeRef = null;
if (effectiveSuperClass != null) {
_createTypeRef = TypeUtils.createTypeRef(effectiveSuperClass);
}
T = _createTypeRef;
}
if ((T != null)) {
T = TypeUtils.enforceNominalTyping(T);
}
} catch (Exception e) {
previousFailure = extractRuleFailedException(e);
/* { superLiteral.eContainer instanceof ParameterizedCallExpression if(containingMemberDecl instanceof N4MethodDeclaration && containingMemberDecl.name == 'constructor') { val ctor = containerTypesHelper.fromContext(superLiteral.eResource).findConstructor(effectiveSuperClass); T = ctor?.createTypeRef } else { T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } } or { superLiteral.eContainer instanceof NewExpression } */
{
try {
EObject _eContainer_1 = superLiteral.eContainer();
/* superLiteral.eContainer instanceof ParameterizedCallExpression */
if (!(_eContainer_1 instanceof ParameterizedCallExpression)) {
sneakyThrowRuleFailedException("superLiteral.eContainer instanceof ParameterizedCallExpression");
}
if (((containingMemberDecl instanceof N4MethodDeclaration) && Objects.equal(containingMemberDecl.getName(), "constructor"))) {
final TMethod ctor = this.containerTypesHelper.fromContext(superLiteral.eResource()).findConstructor(effectiveSuperClass);
ParameterizedTypeRef _createTypeRef_1 = null;
if (ctor != null) {
_createTypeRef_1 = TypeUtils.createTypeRef(ctor);
}
T = _createTypeRef_1;
} else {
T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef();
}
} catch (Exception e_1) {
previousFailure = extractRuleFailedException(e_1);
EObject _eContainer_2 = superLiteral.eContainer();
/* superLiteral.eContainer instanceof NewExpression */
if (!(_eContainer_2 instanceof NewExpression)) {
sneakyThrowRuleFailedException("superLiteral.eContainer instanceof NewExpression");
}
}
}
}
}
}
} catch (Exception e_2) {
previousFailure = extractRuleFailedException(e_2);
T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef();
}
}
return new Result<TypeRef>(T);
}
use of org.eclipse.n4js.ts.types.TMethod in project n4js by eclipse.
the class ScriptApiTracker method computeMissingApiMethods.
/**
* @param type
* type to search for APIs.
* @param context
* context holding the comparison-adapter
* @return List of {@link VirtualApiTMethod}
*/
public List<TMethod> computeMissingApiMethods(TClass type, EObject context) {
Optional<ProjectComparisonAdapter> optAdapt = firstProjectComparisonAdapter(context.eResource());
if (optAdapt.isPresent()) {
ProjectComparisonEntry compareEntry = optAdapt.get().getEntryFor(EcoreUtil2.getContainerOfType(type, TModule.class));
ProjectComparisonEntry typeCompare = compareEntry.getChildForElementImpl(type);
if (typeCompare != null) {
return typeCompare.allChildren().filter(pce -> pce.getElementAPI() instanceof TMethod).filter(pce -> pce.getElementImpl()[0] == null).map(pce -> {
TMethod apiMethod = (TMethod) pce.getElementAPI();
TMethod copy = TypeUtils.copyPartial(apiMethod, TypesPackage.Literals.SYNTAX_RELATED_TELEMENT__AST_ELEMENT);
TMethod ret = new VirtualApiTMethod(apiMethod.getName(), copy);
return ret;
}).collect(Collectors.toList());
}
}
return emptyList();
}
Aggregations