diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index 0553ecc3d858..9a14dfd79d99 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -4,6 +4,8 @@ private import codeql.unified.internal.NameBinding private import codeql.unified.internal.dataflow.DataFlowCall private import codeql.unified.internal.dataflow.DataFlowCallable private import codeql.unified.internal.dataflow.CallGraph +private import codeql.unified.internal.typeinference.Type as Type +private import codeql.unified.internal.typeinference.TypeMention /** Stats about name nodes that static name binding could resolve. */ module StaticNameResolutionStats implements EntityStatsSig { @@ -109,6 +111,18 @@ module CallGraphStats implements EntityStatsSig { module CallGraphStatsReport = EntityReportStats; +module TypeMentionStats implements EntityStatsSig { + class Candidate extends ExprTypeMention { + predicate isOk() { this.getType() = any(Type::Type t | not t instanceof Type::UnknownType) } + } + + string getOkText() { result = "resolvable type mentions" } + + string getNotOkText() { result = "unresolvable type mentions" } +} + +module TypeMentionStatsReport = EntityReportStats; + /** * Gets summary statistics about taint. */ diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll index 2b670c0d2fc9..99d12990044b 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll @@ -5,8 +5,10 @@ private import TypeInferencePlugin as Plugin private import codeql.unified.internal.StaticNameBinding private import codeql.unified.internal.ExprPositions +final class TypeMention = TypeMentionImpl; + /** An AST node that mentions a type. */ -abstract class TypeMention extends AstNode { +abstract private class TypeMentionImpl extends AstNode { /** * Gets the type mentioned at `path`. */ @@ -27,8 +29,10 @@ private Type resolveType(Identifier access) { ) } -abstract private class ExprTypeMention extends TypeMention, Expr { - ExprTypeMention() { isInTypeContext(this) } +final class ExprTypeMention = ExprTypeMentionImpl; + +abstract private class ExprTypeMentionImpl extends TypeMentionImpl, Expr { + ExprTypeMentionImpl() { isInTypeContext(this) } pragma[nomagic] abstract TypePath getTypeArgumentPath(int i); @@ -37,7 +41,7 @@ abstract private class ExprTypeMention extends TypeMention, Expr { /** * A type mention that resolves via an alias (aliases are expanded). */ -private class AliasExprTypeMention extends ExprTypeMention { +private class AliasExprTypeMention extends ExprTypeMentionImpl { private TypeAliasDeclaration alias; AliasExprTypeMention() { alias.getNameNode() = getStaticBindingTargetFromRef(this) } @@ -62,7 +66,7 @@ private class AliasExprTypeMention extends ExprTypeMention { /** * A type mention that does not resolve via an alias. */ -private class NonAliasExprTypeMention extends ExprTypeMention { +private class NonAliasExprTypeMention extends ExprTypeMentionImpl { NonAliasExprTypeMention() { not this instanceof AliasExprTypeMention } private Type getRootType0() { @@ -141,7 +145,7 @@ private class NonAliasExprTypeMention extends ExprTypeMention { } } -private class GenericTypeExprTypeMention extends TypeMention, GenericTypeExpr { +private class GenericTypeExprTypeMention extends TypeMentionImpl, GenericTypeExpr { private ExprTypeMention base; GenericTypeExprTypeMention() { base = this.getBase() } @@ -163,7 +167,7 @@ private class GenericTypeExprTypeMention extends TypeMention, GenericTypeExpr { } /** A class declaration mentions itself. */ -private class ClassLikeDeclarationTypeMention extends TypeMention, Identifier { +private class ClassLikeDeclarationTypeMention extends TypeMentionImpl, Identifier { private ClassLikeDeclaration c; ClassLikeDeclarationTypeMention() { this = c.getNameNode() } diff --git a/unified/ql/src/diagnostic/ExtractorInformation.ql b/unified/ql/src/diagnostic/ExtractorInformation.ql index 3fc0634b3344..ddf225db6fd8 100644 --- a/unified/ql/src/diagnostic/ExtractorInformation.ql +++ b/unified/ql/src/diagnostic/ExtractorInformation.ql @@ -42,7 +42,8 @@ where numberOfLinesOfCodeByExtension(key, value) or StaticNameResolutionStatsReport::keyValuePair(key, value) or FilesCoveredByModuleManifestStatsReport::keyValuePair(key, value) or - CallGraphStatsReport::keyValuePair(key, value) + CallGraphStatsReport::keyValuePair(key, value) or + TypeMentionStatsReport::keyValuePair(key, value) ) and /* Infinity */ value != 1.0 / 0.0 and