Skip to content

Commit

Permalink
Remove TypeIRegistry, TypeI, ObjectTypeI, and FunctionTypeI interface…
Browse files Browse the repository at this point in the history
…s and use the underlying implementations.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=195682279
  • Loading branch information
concavelenz authored and tjgq committed May 8, 2018
1 parent 827ad54 commit dda0e15
Show file tree
Hide file tree
Showing 92 changed files with 899 additions and 1,755 deletions.
5 changes: 1 addition & 4 deletions src/com/google/javascript/jscomp/AbstractCompiler.java
Expand Up @@ -30,7 +30,6 @@
import com.google.javascript.rhino.ErrorReporter; import com.google.javascript.rhino.ErrorReporter;
import com.google.javascript.rhino.InputId; import com.google.javascript.rhino.InputId;
import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Node;
import com.google.javascript.rhino.TypeIRegistry;
import com.google.javascript.rhino.jstype.JSTypeRegistry; import com.google.javascript.rhino.jstype.JSTypeRegistry;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
Expand Down Expand Up @@ -157,9 +156,7 @@ static enum MostRecentTypechecker {
*/ */
public abstract JSTypeRegistry getTypeRegistry(); public abstract JSTypeRegistry getTypeRegistry();


public abstract TypeIRegistry getTypeIRegistry(); public abstract void clearJSTypeRegistry();

public abstract void clearTypeIRegistry();


abstract void forwardDeclareType(String typeName); abstract void forwardDeclareType(String typeName);


Expand Down
25 changes: 12 additions & 13 deletions src/com/google/javascript/jscomp/AccessControlUtils.java
Expand Up @@ -20,10 +20,9 @@
import com.google.javascript.rhino.JSDocInfo; import com.google.javascript.rhino.JSDocInfo;
import com.google.javascript.rhino.JSDocInfo.Visibility; import com.google.javascript.rhino.JSDocInfo.Visibility;
import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Node;
import com.google.javascript.rhino.ObjectTypeI;
import com.google.javascript.rhino.StaticSourceFile; import com.google.javascript.rhino.StaticSourceFile;
import com.google.javascript.rhino.TypeI; import com.google.javascript.rhino.jstype.JSType;

import com.google.javascript.rhino.jstype.ObjectType;
import javax.annotation.Nullable; import javax.annotation.Nullable;


/** /**
Expand Down Expand Up @@ -59,7 +58,7 @@ static Visibility getEffectiveNameVisibility(Node name, Var var,
} }
Visibility defaultVisibilityForFile = Visibility defaultVisibilityForFile =
fileVisibilityMap.get(var.getSourceFile()); fileVisibilityMap.get(var.getSourceFile());
TypeI type = name.getTypeI(); JSType type = name.getJSType();
boolean createdFromGoogProvide = (type != null && type.isLiteralObject()); boolean createdFromGoogProvide = (type != null && type.isLiteralObject());
// Ignore @fileoverview visibility when computing the effective visibility // Ignore @fileoverview visibility when computing the effective visibility
// for names created by goog.provide. // for names created by goog.provide.
Expand Down Expand Up @@ -95,7 +94,7 @@ static Visibility getEffectiveNameVisibility(Node name, Var var,
*/ */
static Visibility getEffectivePropertyVisibility( static Visibility getEffectivePropertyVisibility(
Node property, Node property,
ObjectTypeI referenceType, ObjectType referenceType,
ImmutableMap<StaticSourceFile, Visibility> fileVisibilityMap, ImmutableMap<StaticSourceFile, Visibility> fileVisibilityMap,
@Nullable CodingConvention codingConvention) { @Nullable CodingConvention codingConvention) {
String propertyName = property.getLastChild().getString(); String propertyName = property.getLastChild().getString();
Expand All @@ -106,7 +105,7 @@ static Visibility getEffectivePropertyVisibility(
boolean isOverride = parent.getJSDocInfo() != null boolean isOverride = parent.getJSDocInfo() != null
&& parent.isAssign() && parent.isAssign()
&& parent.getFirstChild() == property; && parent.getFirstChild() == property;
ObjectTypeI objectType = getObjectType( ObjectType objectType = getObjectType(
referenceType, isOverride, propertyName); referenceType, isOverride, propertyName);
if (isOverride) { if (isOverride) {
Visibility overridden = getOverriddenPropertyVisibility( Visibility overridden = getOverriddenPropertyVisibility(
Expand All @@ -124,7 +123,7 @@ static Visibility getEffectivePropertyVisibility(
* or null if it is not known. * or null if it is not known.
*/ */
@Nullable static StaticSourceFile getDefiningSource( @Nullable static StaticSourceFile getDefiningSource(
Node getprop, @Nullable ObjectTypeI referenceType, String propertyName) { Node getprop, @Nullable ObjectType referenceType, String propertyName) {
if (referenceType != null) { if (referenceType != null) {
Node propDefNode = referenceType.getPropertyDefSite(propertyName); Node propDefNode = referenceType.getPropertyDefSite(propertyName);
if (propDefNode != null) { if (propDefNode != null) {
Expand All @@ -137,16 +136,16 @@ static Visibility getEffectivePropertyVisibility(
/** /**
* Returns the lowest property defined on a class with visibility information. * Returns the lowest property defined on a class with visibility information.
*/ */
@Nullable static ObjectTypeI getObjectType( @Nullable static ObjectType getObjectType(
@Nullable ObjectTypeI referenceType, @Nullable ObjectType referenceType,
boolean isOverride, boolean isOverride,
String propertyName) { String propertyName) {
if (referenceType == null) { if (referenceType == null) {
return null; return null;
} }


// Find the lowest property defined on a class with visibility information. // Find the lowest property defined on a class with visibility information.
ObjectTypeI current = isOverride ? referenceType.getPrototypeObject() : referenceType; ObjectType current = isOverride ? referenceType.getPrototypeObject() : referenceType;
for (; current != null; current = current.getPrototypeObject()) { for (; current != null; current = current.getPrototypeObject()) {
JSDocInfo docInfo = current.getOwnPropertyJSDocInfo(propertyName); JSDocInfo docInfo = current.getOwnPropertyJSDocInfo(propertyName);
if (docInfo != null && docInfo.getVisibility() != Visibility.INHERITED) { if (docInfo != null && docInfo.getVisibility() != Visibility.INHERITED) {
Expand All @@ -160,7 +159,7 @@ static Visibility getEffectivePropertyVisibility(
* Returns the original visibility of an overridden property. * Returns the original visibility of an overridden property.
*/ */
private static Visibility getOverriddenPropertyVisibility( private static Visibility getOverriddenPropertyVisibility(
ObjectTypeI objectType, String propertyName) { ObjectType objectType, String propertyName) {
return objectType != null return objectType != null
? objectType.getOwnPropertyJSDocInfo(propertyName).getVisibility() ? objectType.getOwnPropertyJSDocInfo(propertyName).getVisibility()
: Visibility.INHERITED; : Visibility.INHERITED;
Expand Down Expand Up @@ -193,7 +192,7 @@ private static Visibility getEffectiveVisibilityForOverriddenProperty(
*/ */
private static Visibility getEffectiveVisibilityForNonOverriddenProperty( private static Visibility getEffectiveVisibilityForNonOverriddenProperty(
Node getprop, Node getprop,
ObjectTypeI objectType, ObjectType objectType,
@Nullable Visibility fileOverviewVisibility, @Nullable Visibility fileOverviewVisibility,
@Nullable CodingConvention codingConvention) { @Nullable CodingConvention codingConvention) {
String propertyName = getprop.getLastChild().getString(); String propertyName = getprop.getLastChild().getString();
Expand All @@ -204,7 +203,7 @@ private static Visibility getEffectiveVisibilityForNonOverriddenProperty(
if (objectType != null) { if (objectType != null) {
raw = objectType.getOwnPropertyJSDocInfo(propertyName).getVisibility(); raw = objectType.getOwnPropertyJSDocInfo(propertyName).getVisibility();
} }
TypeI type = getprop.getTypeI(); JSType type = getprop.getJSType();
boolean createdFromGoogProvide = (type != null && type.isLiteralObject()); boolean createdFromGoogProvide = (type != null && type.isLiteralObject());
// Ignore @fileoverview visibility when computing the effective visibility // Ignore @fileoverview visibility when computing the effective visibility
// for properties created by goog.provide. // for properties created by goog.provide.
Expand Down
62 changes: 31 additions & 31 deletions src/com/google/javascript/jscomp/AmbiguateProperties.java
Expand Up @@ -31,11 +31,11 @@
import com.google.javascript.jscomp.graph.GraphColoring.GreedyGraphColoring; import com.google.javascript.jscomp.graph.GraphColoring.GreedyGraphColoring;
import com.google.javascript.jscomp.graph.GraphNode; import com.google.javascript.jscomp.graph.GraphNode;
import com.google.javascript.jscomp.graph.SubGraph; import com.google.javascript.jscomp.graph.SubGraph;
import com.google.javascript.rhino.FunctionTypeI;
import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Node;
import com.google.javascript.rhino.ObjectTypeI; import com.google.javascript.rhino.jstype.FunctionType;
import com.google.javascript.rhino.TypeI; import com.google.javascript.rhino.jstype.JSType;
import com.google.javascript.rhino.jstype.JSTypeNative; import com.google.javascript.rhino.jstype.JSTypeNative;
import com.google.javascript.rhino.jstype.ObjectType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.BitSet; import java.util.BitSet;
import java.util.Comparator; import java.util.Comparator;
Expand Down Expand Up @@ -110,11 +110,11 @@ public int compare(Property p1, Property p2) {
} }
}; };


/** A map from TypeI to a unique representative Integer. */ /** A map from JSType to a unique representative Integer. */
private final BiMap<TypeI, Integer> intForType = HashBiMap.create(); private final BiMap<JSType, Integer> intForType = HashBiMap.create();


/** A map from TypeI to JSTypeBitSet representing the types related to the type. */ /** A map from JSType to JSTypeBitSet representing the types related to the type. */
private final Map<TypeI, JSTypeBitSet> relatedBitsets = new HashMap<>(); private final Map<JSType, JSTypeBitSet> relatedBitsets = new HashMap<>();


/** A set of types that invalidate properties from ambiguation. */ /** A set of types that invalidate properties from ambiguation. */
private final InvalidatingTypes invalidatingTypes; private final InvalidatingTypes invalidatingTypes;
Expand All @@ -134,7 +134,7 @@ public int compare(Property p1, Property p2) {
this.reservedFirstCharacters = reservedFirstCharacters; this.reservedFirstCharacters = reservedFirstCharacters;
this.reservedNonFirstCharacters = reservedNonFirstCharacters; this.reservedNonFirstCharacters = reservedNonFirstCharacters;


this.invalidatingTypes = new InvalidatingTypes.Builder(compiler.getTypeIRegistry()) this.invalidatingTypes = new InvalidatingTypes.Builder(compiler.getTypeRegistry())
.addTypesInvalidForPropertyRenaming() .addTypesInvalidForPropertyRenaming()
.addAllTypeMismatches(compiler.getTypeMismatches()) .addAllTypeMismatches(compiler.getTypeMismatches())
.addAllTypeMismatches(compiler.getImplicitInterfaceUses()) .addAllTypeMismatches(compiler.getImplicitInterfaceUses())
Expand Down Expand Up @@ -163,7 +163,7 @@ Map<String, String> getRenamingMap() {
} }


/** Returns an integer that uniquely identifies a JSType. */ /** Returns an integer that uniquely identifies a JSType. */
private int getIntForType(TypeI type) { private int getIntForType(JSType type) {
// Templatized types don't exist at runtime, so collapse to raw type // Templatized types don't exist at runtime, so collapse to raw type
if (type != null && type.isGenericObjectType()) { if (type != null && type.isGenericObjectType()) {
type = type.toMaybeObjectType().getRawType(); type = type.toMaybeObjectType().getRawType();
Expand Down Expand Up @@ -240,7 +240,7 @@ public void process(Node externs, Node root) {
} }
} }


private BitSet getRelatedTypesOnNonUnion(TypeI type) { private BitSet getRelatedTypesOnNonUnion(JSType type) {
// All of the types we encounter should have been added to the // All of the types we encounter should have been added to the
// relatedBitsets via computeRelatedTypes. // relatedBitsets via computeRelatedTypes.
if (relatedBitsets.containsKey(type)) { if (relatedBitsets.containsKey(type)) {
Expand Down Expand Up @@ -275,11 +275,11 @@ private BitSet getRelatedTypesOnNonUnion(TypeI type) {
* functions, because the function type is invalidating (i.e. its properties * functions, because the function type is invalidating (i.e. its properties
* won't be ambiguated). * won't be ambiguated).
*/ */
private void computeRelatedTypes(TypeI type) { private void computeRelatedTypes(JSType type) {
if (type.isUnionType()) { if (type.isUnionType()) {
type = type.restrictByNotNullOrUndefined(); type = type.restrictByNotNullOrUndefined();
if (type.isUnionType()) { if (type.isUnionType()) {
for (TypeI alt : type.getUnionMembers()) { for (JSType alt : type.getUnionMembers()) {
computeRelatedTypes(alt); computeRelatedTypes(alt);
} }
return; return;
Expand All @@ -297,17 +297,17 @@ private void computeRelatedTypes(TypeI type) {


// A prototype is related to its instance. // A prototype is related to its instance.
if (type.isPrototypeObject()) { if (type.isPrototypeObject()) {
FunctionTypeI maybeCtor = type.toMaybeObjectType().getOwnerFunction(); FunctionType maybeCtor = type.toMaybeObjectType().getOwnerFunction();
if (maybeCtor.isConstructor() || maybeCtor.isInterface()) { if (maybeCtor.isConstructor() || maybeCtor.isInterface()) {
addRelatedInstance(maybeCtor, related); addRelatedInstance(maybeCtor, related);
} }
return; return;
} }


// A class/interface is related to its subclasses/implementors. // A class/interface is related to its subclasses/implementors.
FunctionTypeI constructor = type.toMaybeObjectType().getConstructor(); FunctionType constructor = type.toMaybeObjectType().getConstructor();
if (constructor != null) { if (constructor != null) {
for (FunctionTypeI subType : constructor.getDirectSubTypes()) { for (FunctionType subType : constructor.getDirectSubTypes()) {
addRelatedInstance(subType, related); addRelatedInstance(subType, related);
} }
} }
Expand All @@ -317,10 +317,10 @@ private void computeRelatedTypes(TypeI type) {
* Adds the instance of the given constructor, its implicit prototype and all * Adds the instance of the given constructor, its implicit prototype and all
* its related types to the given bit set. * its related types to the given bit set.
*/ */
private void addRelatedInstance(FunctionTypeI constructor, JSTypeBitSet related) { private void addRelatedInstance(FunctionType constructor, JSTypeBitSet related) {
checkArgument(constructor.hasInstanceType(), checkArgument(constructor.hasInstanceType(),
"Constructor %s without instance type.", constructor); "Constructor %s without instance type.", constructor);
ObjectTypeI instanceType = constructor.getInstanceType(); ObjectType instanceType = constructor.getInstanceType();
related.set(getIntForType(instanceType.getPrototypeObject())); related.set(getIntForType(instanceType.getPrototypeObject()));
computeRelatedTypes(instanceType); computeRelatedTypes(instanceType);
related.or(relatedBitsets.get(instanceType)); related.or(relatedBitsets.get(instanceType));
Expand Down Expand Up @@ -434,7 +434,7 @@ public void visit(NodeTraversal t, Node n, Node parent) {
switch (n.getToken()) { switch (n.getToken()) {
case GETPROP: { case GETPROP: {
Node propNode = n.getSecondChild(); Node propNode = n.getSecondChild();
TypeI type = getTypeI(n.getFirstChild()); JSType type = getJSType(n.getFirstChild());
maybeMarkCandidate(propNode, type); maybeMarkCandidate(propNode, type);
return; return;
} }
Expand Down Expand Up @@ -464,10 +464,10 @@ public void visit(NodeTraversal t, Node n, Node parent) {
return; return;
} }


maybeMarkCandidate(propName, getTypeI(n.getSecondChild())); maybeMarkCandidate(propName, getJSType(n.getSecondChild()));
} else if (NodeUtil.isObjectDefinePropertiesDefinition(n)) { } else if (NodeUtil.isObjectDefinePropertiesDefinition(n)) {
Node typeObj = n.getSecondChild(); Node typeObj = n.getSecondChild();
TypeI type = getTypeI(typeObj); JSType type = getJSType(typeObj);
Node objectLiteral = typeObj.getNext(); Node objectLiteral = typeObj.getNext();


if (!objectLiteral.isObjectLit()) { if (!objectLiteral.isObjectLit()) {
Expand All @@ -493,7 +493,7 @@ public void visit(NodeTraversal t, Node n, Node parent) {


// The children of an OBJECTLIT node are keys, where the values // The children of an OBJECTLIT node are keys, where the values
// are the children of the keys. // are the children of the keys.
TypeI type = getTypeI(n); JSType type = getJSType(n);
for (Node key = n.getFirstChild(); key != null; key = key.getNext()) { for (Node key = n.getFirstChild(); key != null; key = key.getNext()) {
// We only want keys that were unquoted. // We only want keys that were unquoted.
// Keys are STRING, GET, SET // Keys are STRING, GET, SET
Expand Down Expand Up @@ -526,15 +526,15 @@ public void visit(NodeTraversal t, Node n, Node parent) {
* *
* @param n The STRING node for a property * @param n The STRING node for a property
*/ */
private void maybeMarkCandidate(Node n, TypeI type) { private void maybeMarkCandidate(Node n, JSType type) {
String name = n.getString(); String name = n.getString();
if (!externedNames.contains(name)) { if (!externedNames.contains(name)) {
stringNodesToRename.add(n); stringNodesToRename.add(n);
recordProperty(name, type); recordProperty(name, type);
} }
} }


private Property recordProperty(String name, TypeI type) { private Property recordProperty(String name, JSType type) {
Property prop = getProperty(name); Property prop = getProperty(name);
prop.addType(type); prop.addType(type);
return prop; return prop;
Expand All @@ -554,18 +554,18 @@ private Property getProperty(String name) {
* This method gets the JSType from the Node argument and verifies that it is * This method gets the JSType from the Node argument and verifies that it is
* present. * present.
*/ */
private TypeI getTypeI(Node n) { private JSType getJSType(Node n) {
if (n == null) { if (n == null) {
return compiler.getTypeIRegistry().getNativeType(JSTypeNative.UNKNOWN_TYPE); return compiler.getTypeRegistry().getNativeType(JSTypeNative.UNKNOWN_TYPE);
} }


TypeI type = n.getTypeI(); JSType type = n.getJSType();
if (type == null) { if (type == null) {
// TODO(user): This branch indicates a compiler bug, not worthy of // TODO(user): This branch indicates a compiler bug, not worthy of
// halting the compilation but we should log this and analyze to track // halting the compilation but we should log this and analyze to track
// down why it happens. This is not critical and will be resolved over // down why it happens. This is not critical and will be resolved over
// time as the type checker is extended. // time as the type checker is extended.
return compiler.getTypeIRegistry().getNativeType(JSTypeNative.UNKNOWN_TYPE); return compiler.getTypeRegistry().getNativeType(JSTypeNative.UNKNOWN_TYPE);
} else { } else {
return type; return type;
} }
Expand All @@ -589,7 +589,7 @@ private class Property {
} }


/** Add this type to this property, calculating */ /** Add this type to this property, calculating */
void addType(TypeI newType) { void addType(JSType newType) {
if (skipAmbiguating) { if (skipAmbiguating) {
return; return;
} }
Expand All @@ -599,7 +599,7 @@ void addType(TypeI newType) {
if (newType.isUnionType()) { if (newType.isUnionType()) {
newType = newType.restrictByNotNullOrUndefined(); newType = newType.restrictByNotNullOrUndefined();
if (newType.isUnionType()) { if (newType.isUnionType()) {
for (TypeI alt : newType.getUnionMembers()) { for (JSType alt : newType.getUnionMembers()) {
addNonUnionType(alt); addNonUnionType(alt);
} }
return; return;
Expand All @@ -608,12 +608,12 @@ void addType(TypeI newType) {
addNonUnionType(newType); addNonUnionType(newType);
} }


private void addNonUnionType(TypeI newType) { private void addNonUnionType(JSType newType) {
if (skipAmbiguating || invalidatingTypes.isInvalidating(newType)) { if (skipAmbiguating || invalidatingTypes.isInvalidating(newType)) {
skipAmbiguating = true; skipAmbiguating = true;
return; return;
} }
ObjectTypeI maybeObj = newType.toMaybeObjectType(); ObjectType maybeObj = newType.toMaybeObjectType();
if (maybeObj != null) { if (maybeObj != null) {
newType = maybeObj.withoutStrayProperties(); newType = maybeObj.withoutStrayProperties();
} }
Expand Down
20 changes: 10 additions & 10 deletions src/com/google/javascript/jscomp/AstValidator.java
Expand Up @@ -20,12 +20,12 @@
import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.common.base.Strings.isNullOrEmpty;


import com.google.javascript.jscomp.parsing.parser.FeatureSet.Feature; import com.google.javascript.jscomp.parsing.parser.FeatureSet.Feature;
import com.google.javascript.rhino.FunctionTypeI;
import com.google.javascript.rhino.InputId; import com.google.javascript.rhino.InputId;
import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Node;
import com.google.javascript.rhino.Token; import com.google.javascript.rhino.Token;
import com.google.javascript.rhino.TypeI; import com.google.javascript.rhino.jstype.FunctionType;
import com.google.javascript.rhino.TypeI.Nullability; import com.google.javascript.rhino.jstype.JSType;
import com.google.javascript.rhino.jstype.JSType.Nullability;
import java.util.Objects; import java.util.Objects;
import javax.annotation.Nullable; import javax.annotation.Nullable;


Expand Down Expand Up @@ -426,27 +426,27 @@ private void validateNameType(Node nameNode) {
private void validateCallType(Node callNode) { private void validateCallType(Node callNode) {
// TODO(b/74537281): Shouldn't CALL nodes always have a type, even if it is unknown? // TODO(b/74537281): Shouldn't CALL nodes always have a type, even if it is unknown?
Node callee = callNode.getFirstChild(); Node callee = callNode.getFirstChild();
TypeI calleeTypeI = checkNotNull(callee.getTypeI(), callNode); JSType calleeTypeI = checkNotNull(callee.getJSType(), callNode);


if (calleeTypeI.isFunctionType()) { if (calleeTypeI.isFunctionType()) {
FunctionTypeI calleeFunctionTypeI = calleeTypeI.toMaybeFunctionType(); FunctionType calleeFunctionTypeI = calleeTypeI.toMaybeFunctionType();
TypeI returnTypeI = calleeFunctionTypeI.getReturnType(); JSType returnTypeI = calleeFunctionTypeI.getReturnType();
// TODO(b/74537281): This will fail after CAST nodes have been removed from the AST. // TODO(b/74537281): This will fail after CAST nodes have been removed from the AST.
// Must be fixed before this check can be done after optimizations. // Must be fixed before this check can be done after optimizations.
expectMatchingTypeInformation(callNode, returnTypeI); expectMatchingTypeInformation(callNode, returnTypeI);
} // TODO(b/74537281): What other cases should be covered? } // TODO(b/74537281): What other cases should be covered?
} }


private void expectSomeTypeInformation(Node n) { private void expectSomeTypeInformation(Node n) {
if (n.getTypeI() == null) { if (n.getJSType() == null) {
violation( violation(
"Type information missing" + "\n" + compiler.toSource(NodeUtil.getEnclosingStatement(n)), "Type information missing" + "\n" + compiler.toSource(NodeUtil.getEnclosingStatement(n)),
n); n);
} }
} }


private void expectMatchingTypeInformation(Node n, TypeI expectedTypeI) { private void expectMatchingTypeInformation(Node n, JSType expectedTypeI) {
TypeI typeI = n.getTypeI(); JSType typeI = n.getJSType();
if (!Objects.equals(expectedTypeI, typeI)) { if (!Objects.equals(expectedTypeI, typeI)) {
violation( violation(
"Expected type: " "Expected type: "
Expand All @@ -457,7 +457,7 @@ private void expectMatchingTypeInformation(Node n, TypeI expectedTypeI) {
} }
} }


private String getTypeAnnotationString(@Nullable TypeI typeI) { private String getTypeAnnotationString(@Nullable JSType typeI) {
if (typeI == null) { if (typeI == null) {
return "NO TYPE INFORMATION"; return "NO TYPE INFORMATION";
} else { } else {
Expand Down

0 comments on commit dda0e15

Please sign in to comment.