From 99cf082693fe16388dce4616c47033e8bb4881f0 Mon Sep 17 00:00:00 2001 From: johnlenz Date: Sat, 10 Mar 2018 08:47:50 -0800 Subject: [PATCH] More prework for adding support for non-global scope types to JSTypeRegistry ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=188603342 --- .../javascript/jscomp/CheckMissingReturn.java | 6 ++--- .../javascript/jscomp/Es6ToEs3Util.java | 2 +- .../jscomp/RemoveSuperMethodsPass.java | 5 +++-- .../jscomp/RemoveUnusedPolyfills.java | 2 +- .../javascript/jscomp/TypeTransformation.java | 11 +++++++++- .../javascript/jscomp/TypedCodeGenerator.java | 5 +++-- .../rhino/jstype/PrototypeObjectType.java | 22 +++++++++---------- .../jscomp/SimpleReplaceScriptTest.java | 6 ++--- 8 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/com/google/javascript/jscomp/CheckMissingReturn.java b/src/com/google/javascript/jscomp/CheckMissingReturn.java index 7efe974b1d1..5ab0942235e 100644 --- a/src/com/google/javascript/jscomp/CheckMissingReturn.java +++ b/src/com/google/javascript/jscomp/CheckMissingReturn.java @@ -199,8 +199,8 @@ private JSType explicitReturnExpected(Node scopeRoot) { * with an empty body */ private static boolean isEmptyFunction(Node function) { - return function.getChildCount() == 3 && - !function.getSecondChild().getNext().hasChildren(); + return function.getChildCount() == 3 + && !function.getSecondChild().getNext().hasChildren(); } /** @@ -208,7 +208,7 @@ private static boolean isEmptyFunction(Node function) { * containing void or unknown */ private boolean isVoidOrUnknown(JSType returnType) { - final JSType voidType = compiler.getTypeIRegistry().getNativeType(JSTypeNative.VOID_TYPE); + final JSType voidType = compiler.getTypeRegistry().getNativeType(JSTypeNative.VOID_TYPE); return voidType.isSubtype(returnType); } } diff --git a/src/com/google/javascript/jscomp/Es6ToEs3Util.java b/src/com/google/javascript/jscomp/Es6ToEs3Util.java index 6667c6d55df..10269b55601 100644 --- a/src/com/google/javascript/jscomp/Es6ToEs3Util.java +++ b/src/com/google/javascript/jscomp/Es6ToEs3Util.java @@ -119,7 +119,7 @@ static TypeI createGenericType( if (!shouldCreate) { return null; } - ObjectTypeI genericType = registry.getNativeType(typeName); + ObjectTypeI genericType = (ObjectTypeI) (registry.getNativeType(typeName)); ObjectTypeI uninstantiated = genericType.getRawType(); return registry.instantiateGenericType(uninstantiated, ImmutableList.of(typeArg)); } diff --git a/src/com/google/javascript/jscomp/RemoveSuperMethodsPass.java b/src/com/google/javascript/jscomp/RemoveSuperMethodsPass.java index 2c1f14dfab0..222d01f04cb 100644 --- a/src/com/google/javascript/jscomp/RemoveSuperMethodsPass.java +++ b/src/com/google/javascript/jscomp/RemoveSuperMethodsPass.java @@ -128,8 +128,9 @@ private boolean functionNameMatches(String enclosingMethodName, Node call) { // Check that call references the superclass String calledClass = callNameSplittedByPrototypeMarker[0]; - TypeI subclassType = compiler.getTypeIRegistry().getType(enclosingClassName); - TypeI calledClassType = compiler.getTypeIRegistry().getType(calledClass); + // TODO(moz): fix this to handle shadowing local type names + TypeI subclassType = compiler.getTypeIRegistry().getGlobalType(enclosingClassName); + TypeI calledClassType = compiler.getTypeIRegistry().getGlobalType(calledClass); if (subclassType == null || calledClassType == null) { return false; } diff --git a/src/com/google/javascript/jscomp/RemoveUnusedPolyfills.java b/src/com/google/javascript/jscomp/RemoveUnusedPolyfills.java index 4fb48964fa0..e18ae4636b1 100644 --- a/src/com/google/javascript/jscomp/RemoveUnusedPolyfills.java +++ b/src/com/google/javascript/jscomp/RemoveUnusedPolyfills.java @@ -201,7 +201,7 @@ boolean isTypeCompatible(TypeI receiverType, String typeName) { // Look up the typename in the registry. All the polyfilled method // receiver types are built-in JS types, so they had better not be // missing from the registry. - TypeI type = compiler.getTypeIRegistry().getType(typeName); + TypeI type = compiler.getTypeIRegistry().getGlobalType(typeName); if (type == null) { throw new RuntimeException("Missing built-in type: " + typeName); } diff --git a/src/com/google/javascript/jscomp/TypeTransformation.java b/src/com/google/javascript/jscomp/TypeTransformation.java index 965a27c4b26..36e8439d8f2 100644 --- a/src/com/google/javascript/jscomp/TypeTransformation.java +++ b/src/com/google/javascript/jscomp/TypeTransformation.java @@ -31,7 +31,9 @@ import com.google.javascript.rhino.TypeI; import com.google.javascript.rhino.TypeIEnv; import com.google.javascript.rhino.TypeIRegistry; +import com.google.javascript.rhino.jstype.JSType; import com.google.javascript.rhino.jstype.JSTypeNative; +import com.google.javascript.rhino.jstype.StaticTypedScope; import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; @@ -130,8 +132,15 @@ private Keywords nameToKeyword(String s) { return TypeTransformationParser.Keywords.valueOf(s.toUpperCase()); } + @SuppressWarnings("unchecked") private TypeI getType(String typeName) { - TypeI type = registry.getType(typeName); + TypeI type; + if (typeEnv instanceof StaticTypedScope) { + type = registry.getType((StaticTypedScope) typeEnv, typeName); + } else { + // TODO(johnlenz): remove this branch once NTI is deleted. + type = registry.getType(null, typeName); + } if (type != null) { return type; } diff --git a/src/com/google/javascript/jscomp/TypedCodeGenerator.java b/src/com/google/javascript/jscomp/TypedCodeGenerator.java index e95f0c8b895..9a68f0ac12c 100644 --- a/src/com/google/javascript/jscomp/TypedCodeGenerator.java +++ b/src/com/google/javascript/jscomp/TypedCodeGenerator.java @@ -253,11 +253,12 @@ private ObjectTypeI findMethodOwner(Node n) { if (parent.isAssign()) { Node target = parent.getFirstChild(); if (NodeUtil.isPrototypeProperty(target)) { - TypeI type = registry.getType(target.getFirstFirstChild().getQualifiedName()); + // TODO(johnlenz): handle non-global types + TypeI type = registry.getGlobalType(target.getFirstFirstChild().getQualifiedName()); ctor = type != null ? ((ObjectTypeI) type).getConstructor() : null; } } else if (parent.isClass()) { - // TODO(sdh): test this case once NTI understands ES6 classes + // TODO(sdh): test this case once the type checker understands ES6 classes ctor = parent.getTypeI().toMaybeFunctionType(); } return ctor != null ? ctor.getInstanceType() : null; diff --git a/src/com/google/javascript/rhino/jstype/PrototypeObjectType.java b/src/com/google/javascript/rhino/jstype/PrototypeObjectType.java index 56265c1d6b2..1c19c007a7e 100644 --- a/src/com/google/javascript/rhino/jstype/PrototypeObjectType.java +++ b/src/com/google/javascript/rhino/jstype/PrototypeObjectType.java @@ -224,15 +224,15 @@ public void setPropertyNode(String propertyName, Node defSite) { @Override public boolean matchesNumberContext() { - return isNumberObjectType() || isDateType() || isBooleanObjectType() || - isStringObjectType() || hasOverridenNativeProperty("valueOf"); + return isNumberObjectType() || isDateType() || isBooleanObjectType() + || isStringObjectType() || hasOverriddenNativeProperty("valueOf"); } @Override public boolean matchesStringContext() { - return isTheObjectType() || isStringObjectType() || isDateType() || - isRegexpType() || isArrayType() || isNumberObjectType() || - isBooleanObjectType() || hasOverridenNativeProperty("toString"); + return isTheObjectType() || isStringObjectType() || isDateType() + || isRegexpType() || isArrayType() || isNumberObjectType() + || isBooleanObjectType() || hasOverriddenNativeProperty("toString"); } @Override @@ -244,16 +244,16 @@ public boolean matchesSymbolContext() { * Given the name of a native object property, checks whether the property is * present on the object and different from the native one. */ - private boolean hasOverridenNativeProperty(String propertyName) { + private boolean hasOverriddenNativeProperty(String propertyName) { if (isNativeObjectType()) { return false; } JSType propertyType = getPropertyType(propertyName); ObjectType nativeType = - isFunctionType() ? - registry.getNativeObjectType(JSTypeNative.FUNCTION_PROTOTYPE) : - registry.getNativeObjectType(JSTypeNative.OBJECT_PROTOTYPE); + isFunctionType() + ? registry.getNativeObjectType(JSTypeNative.FUNCTION_PROTOTYPE) + : registry.getNativeObjectType(JSTypeNative.OBJECT_PROTOTYPE); JSType nativePropertyType = nativeType.getPropertyType(propertyName); return propertyType != nativePropertyType; } @@ -297,8 +297,8 @@ StringBuilder appendTo(StringBuilder sb, boolean forAnnotations) { // Use a tree set so that the properties are sorted. Set propertyNames = new TreeSet<>(); for (ObjectType current = this; - current != null && !current.isNativeObjectType() && - propertyNames.size() <= MAX_PRETTY_PRINTED_PROPERTIES; + current != null && !current.isNativeObjectType() + && propertyNames.size() <= MAX_PRETTY_PRINTED_PROPERTIES; current = current.getImplicitPrototype()) { propertyNames.addAll(current.getOwnPropertyNames()); } diff --git a/test/com/google/javascript/jscomp/SimpleReplaceScriptTest.java b/test/com/google/javascript/jscomp/SimpleReplaceScriptTest.java index bfeb6543260..d40dda130fb 100644 --- a/test/com/google/javascript/jscomp/SimpleReplaceScriptTest.java +++ b/test/com/google/javascript/jscomp/SimpleReplaceScriptTest.java @@ -675,7 +675,7 @@ public void testSourceNodeOfFunctionTypesUpdated() { Result result = compiler.getResult(); assertNoWarningsOrErrors(result); - JSType type = compiler.getTypeRegistry().getType("ns.Foo"); + JSType type = compiler.getTypeRegistry().getGlobalType("ns.Foo"); FunctionType fnType = type.toObjectType().getConstructor(); Node srcNode = fnType.getSource(); assertNode(srcNode).hasLineno(6); @@ -742,7 +742,7 @@ public void testPrototypeSlotChangedOnCompile() { Compiler compiler = runFullCompile( getOptions(), ImmutableList.of(CLOSURE_BASE, src), 0, 0, false); - JSType type = compiler.getTypeRegistry().getType("ns.Foo"); + JSType type = compiler.getTypeRegistry().getGlobalType("ns.Foo"); FunctionType fnType = type.toObjectType().getConstructor(); StaticTypedSlot originalSlot = fnType.getSlot("prototype"); @@ -750,7 +750,7 @@ public void testPrototypeSlotChangedOnCompile() { assertNoWarningsOrErrors(compiler.getResult()); - type = compiler.getTypeRegistry().getType("ns.Foo"); + type = compiler.getTypeRegistry().getGlobalType("ns.Foo"); fnType = type.toObjectType().getConstructor(); StaticTypedSlot newSlot = fnType.getSlot("prototype"); assertNotSame(originalSlot, newSlot);