JS: Add TypeAnnotation.getClass

This commit is contained in:
Asger F
2019-07-05 15:27:44 +01:00
parent 106539c495
commit 197b4d5637
3 changed files with 41 additions and 0 deletions

View File

@@ -251,6 +251,20 @@ class JSDocNamedTypeExpr extends @jsdoc_named_type_expr, JSDocTypeExpr {
not exists(resolvedName()) and
globalName = getName()
}
override DataFlow::ClassNode getClass() {
exists(string name |
hasQualifiedName(name) and
result.hasQualifiedName(name)
)
or
// Handle case where a local variable has a reference to the class,
// but the class doesn't have a globally qualified name.
exists(string alias, JSDoc::Environment env |
hasNamePartsAndEnv(alias, "", env) and
result.getAClassReference().flowsTo(env.getNodeFromAlias(alias))
)
}
}
/**
@@ -277,6 +291,10 @@ class JSDocAppliedTypeExpr extends @jsdoc_applied_type_expr, JSDocTypeExpr {
override predicate hasQualifiedName(string globalName) {
getHead().hasQualifiedName(globalName)
}
override DataFlow::ClassNode getClass() {
result = getHead().getClass()
}
}
/**
@@ -290,6 +308,10 @@ class JSDocNullableTypeExpr extends @jsdoc_nullable_type_expr, JSDocTypeExpr {
predicate isPrefix() { jsdoc_prefix_qualifier(this) }
override JSDocTypeExpr getAnUnderlyingType() { result = getTypeExpr().getAnUnderlyingType() }
override DataFlow::ClassNode getClass() {
result = getTypeExpr().getClass()
}
}
/**
@@ -303,6 +325,10 @@ class JSDocNonNullableTypeExpr extends @jsdoc_non_nullable_type_expr, JSDocTypeE
predicate isPrefix() { jsdoc_prefix_qualifier(this) }
override JSDocTypeExpr getAnUnderlyingType() { result = getTypeExpr().getAnUnderlyingType() }
override DataFlow::ClassNode getClass() {
result = getTypeExpr().getClass()
}
}
/**
@@ -373,6 +399,10 @@ class JSDocOptionalParameterTypeExpr extends @jsdoc_optional_type_expr, JSDocTyp
JSDocTypeExpr getUnderlyingType() { result = getChild(0) }
override JSDocTypeExpr getAnUnderlyingType() { result = getUnderlyingType().getAnUnderlyingType() }
override DataFlow::ClassNode getClass() {
result = getUnderlyingType().getClass()
}
}
/**

View File

@@ -105,4 +105,11 @@ class TypeAnnotation extends @type_annotation, Locatable {
* Note that this has no result for JSDoc type annotations.
*/
Type getType() { none() }
/**
* Gets the class referenced by this type annotation, if any.
*
* This unfolds nullability modifiers and generic type applications.
*/
DataFlow::ClassNode getClass() { none() }
}

View File

@@ -550,6 +550,10 @@ class TypeExpr extends ExprOrType, @typeexpr, TypeAnnotation {
override StmtContainer getContainer() { result = ExprOrType.super.getContainer() }
override TopLevel getTopLevel() { result = ExprOrType.super.getTopLevel() }
override DataFlow::ClassNode getClass() {
result.getAstNode() = getType().(ClassType).getClass()
}
}
/**