google / google/closure-compiler

NullPointerException when mismatching type is a primitive type in templates

Open
#3,480 2 comments 0 reactions 0 assignees View on GitHub
internal-issue-created
Dominant language
JavaScript
Stars
7.7k
Forks
1.2k
Avg merge
2d 12h
Merged PRs (30d)
6

Description

The following code:
```javascript
const Foo = class Foo {
constructor(v) {
this.value = v;
}
};

/**
*
* @template T
* @param {function(new:T)} type
* @param {T} value
*/
const bar = (type, value) => {
console.log(`${type} , ${value}`);
};

bar(Foo, 0);
```
Triggers a **NullPointerException**:

java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:877)
at com.google.common.collect.ImmutableSet$Builder.add(ImmutableSet.java:483)
at com.google.javascript.jscomp.InvalidatingTypes$Builder.addType(InvalidatingTypes.java:159)
at com.google.javascript.jscomp.InvalidatingTypes$Builder.addAllTypeMismatches(InvalidatingTypes.java:120)
at com.google.javascript.jscomp.DisambiguateProperties.(DisambiguateProperties.java:396)
at com.google.javascript.jscomp.DefaultPassConfig.lambda$new$52(DefaultPassConfig.java:2178)
at com.google.javascript.jscomp.PassFactory.create(PassFactory.java:118)
at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:326)
at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:235)
at com.google.javascript.jscomp.Compiler.performOptimizations(Compiler.java:2416)
at com.google.javascript.jscomp.Compiler.lambda$stage2Passes$1(Compiler.java:793)
at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:102)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:835)

Suggested fix:
```
diff --git a/src/com/google/javascript/jscomp/InvalidatingTypes.java b/src/com/google/javascript/jscomp/InvalidatingTypes.java
index 9c35439a8..1337b8362 100644
--- a/src/com/google/javascript/jscomp/InvalidatingTypes.java
+++ b/src/com/google/javascript/jscomp/InvalidatingTypes.java
@@ -156,7 +156,8 @@ final class InvalidatingTypes {
recordInvalidation(proto, mismatch);
}
if (objType.isConstructor()) {
- types.add(objType.toMaybeFunctionType().getInstanceType());
+ ObjectType ot = objType.toMaybeFunctionType().getInstanceType();
+ types.add(ot != null ? ot : objType);
} else if (objType.isInstanceType()) {
types.add(objType.getConstructor());
}
```

Here is the output with the fix applied:

```
hello.js:17: WARNING - [JSC_TYPE_MISMATCH] actual parameter 1 of bar does not match formal parameter
found : (typeof Foo)
required: function(new:number): ?
bar(Foo, 0);
^^^
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.