@Override public boolean enterIdentNode(IdentNode identNode) { exp.add(identNode.getName()); if (typeOffset == -1) { typeOffset = identNode.getStart(); } return super.enterIdentNode(identNode); }
private boolean isPriviliged(AccessNode aNode) { Node node = aNode.getBase(); while (node instanceof AccessNode) { node = ((AccessNode)node).getBase(); } if (node instanceof IdentNode && ModelUtils.THIS.endsWith(((IdentNode)node).getName())) { return true; } return false; }
public static OffsetRange getOffsetRange(IdentNode node) { // because the truffle parser doesn't set correctly the finish offset, when there are comments after the indent node return new OffsetRange(node.getStart(), node.getStart() + node.getName().length()); }
private void addOccurence(IdentNode iNode, boolean leftSite, boolean isFunction) { if (!iNode.isDestructuredParameter()) { // skip names of destructured param (it's syntetic) addOccurrence(iNode.getName(), getOffsetRange(iNode), leftSite, isFunction); } }
private boolean isKeyAndValueEquals(PropertyNode pNode) { if (pNode.getKey() instanceof IdentNode && pNode.getValue() instanceof IdentNode) { IdentNode key = (IdentNode)pNode.getKey(); IdentNode value = (IdentNode)pNode.getValue(); return key.getName().equals(value.getName()) && key.getStart() == value.getStart(); } if (pNode.getKey() instanceof IdentNode && pNode.getValue() instanceof BinaryNode && ((BinaryNode)pNode.getValue()).tokenType() == TokenType.ASSIGN && ((BinaryNode)pNode.getValue()).lhs() instanceof IdentNode) { IdentNode key = (IdentNode)pNode.getKey(); IdentNode value = (IdentNode)((BinaryNode)pNode.getValue()).lhs(); return key.getName().equals(value.getName()) && key.getStart() == value.getStart(); } return false; }
@Override public Node leaveCatchNode(CatchNode catchNode) { if (!EmbeddingHelper.containsGeneratedIdentifier(catchNode.getException().getName())) { modelBuilder.reset(); } return super.leaveCatchNode(catchNode); }
@CheckForNull static Identifier create(ParserResult parserResult, IdentNode node) { return create(parserResult, node.getName(), node.getStart(), node.getFinish()); }
public String getFunctionName(FunctionNode node) { if (node.isAnonymous() ) { return globalObject.getName() + node.getName().replace(':', '#'); } else { if (node.isNamedFunctionExpression()) { return node.getName(); } return node.getIdent().getName(); } } }
private static List<Identifier> getName(VarNode varNode, ParserResult parserResult) { List<Identifier> name = new ArrayList(); name.add(new Identifier(varNode.getName().getName(), new OffsetRange(varNode.getName().getStart(), varNode.getName().getFinish()))); return name; }
IdentNode ident = ((IdentNode) node); return Arrays.<Identifier>asList(new Identifier( ident.getName(), getOffsetRange(ident))); } else if (node instanceof FunctionNode) { if (((FunctionNode) node).getKind() == FunctionNode.Kind.SCRIPT) { ident.getName(), getOffsetRange(ident))); } else { return Collections.<Identifier>emptyList();
private static List<Identifier> getName(PropertyNode propertyNode, ParserResult parserResult) { List<Identifier> name = new ArrayList(1); if (propertyNode.getKey() instanceof IdentNode) { IdentNode ident = (IdentNode) propertyNode.getKey(); name.add(new Identifier(ident.getName(), getOffsetRange(ident))); } else if (propertyNode.getKey() instanceof LiteralNode){ LiteralNode lNode = (LiteralNode)propertyNode.getKey(); name.add(new Identifier(lNode.getString(), new OffsetRange(lNode.getStart(), lNode.getFinish()))); } return name; }
private boolean isFunctionAnonymous(FunctionNode fn) { boolean result = false; if (fn.isAnonymous() ) { Node lastVisited = getPreviousFromPath(2); if (fn.getIdent().getName().startsWith("L:") && !(lastVisited instanceof PropertyNode)) { //NOI18N // XXX this depends on the implemenation of parser. Find the better way result = true; } else if (fn.getIdent().getStart() == fn.getIdent().getFinish()) { if (lastVisited instanceof CallNode) { result = true; } } } return result; }
private List<Identifier> getName(PropertyNode propertyNode) { List<Identifier> name = new ArrayList(1); if (propertyNode.getGetter() != null || propertyNode.getSetter() != null) { // check whether this is not defining getter or setter of a property. Node previousNode = getPreviousFromPath(1); if (previousNode instanceof FunctionNode) { FunctionNode fNode = (FunctionNode)previousNode; String fName = fNode.getIdent().getName(); if (fName.startsWith("get ") || fName.startsWith("set ")) { //NOI18N name.add(new Identifier(fName, new OffsetRange(fNode.getIdent().getStart(), fNode.getIdent().getFinish()))); return name; } } } return getName(propertyNode, parserResult); }
private JsArray handleArrayCreation(Node initNode, JsObject parent, Identifier name) { if (initNode instanceof UnaryNode && parent != null) { UnaryNode uNode = (UnaryNode)initNode; if (uNode.tokenType() == TokenType.NEW && uNode.getExpression() instanceof CallNode) { CallNode cNode = (CallNode)uNode.getExpression(); if (cNode.getFunction() instanceof IdentNode && "Array".equals(((IdentNode)cNode.getFunction()).getName())) { List<TypeUsage> itemTypes = new ArrayList<TypeUsage>(); for (Node node : cNode.getArgs()) { itemTypes.addAll(ModelUtils.resolveSemiTypeOfExpression(modelBuilder, node)); } EnumSet<Modifier> modifiers = parent.getJSKind() != JsElement.Kind.FILE ? EnumSet.of(Modifier.PRIVATE) : EnumSet.of(Modifier.PUBLIC); JsArrayImpl result = new JsArrayImpl(parent, name, name.getOffsetRange(), true, modifiers, parserResult.getSnapshot().getMimeType(), null); result.addTypesInArray(itemTypes); return result; } } } return null; }
@Override public boolean enterForNode(ForNode forNode) { if (forNode.getInit() instanceof IdentNode) { JsObject parent = modelBuilder.getCurrentObject(); while (parent instanceof JsWith) { parent = parent.getParent(); } IdentNode name = (IdentNode)forNode.getInit(); JsObjectImpl variable = (JsObjectImpl)parent.getProperty(name.getName()); if (variable != null) { Collection<TypeUsage> types = ModelUtils.resolveSemiTypeOfExpression(modelBuilder, forNode.getModify()); for (TypeUsage type : types) { if (type.getType().contains(SemiTypeResolverVisitor.ST_VAR)) { int index = type.getType().lastIndexOf(SemiTypeResolverVisitor.ST_VAR); String newType = type.getType().substring(0, index) + SemiTypeResolverVisitor.ST_ARR + type.getType().substring(index + SemiTypeResolverVisitor.ST_VAR.length()); type = new TypeUsage(newType, type.getOffset(), false); } else if (type.getType().contains(SemiTypeResolverVisitor.ST_PRO)) { int index = type.getType().lastIndexOf(SemiTypeResolverVisitor.ST_PRO); String newType = type.getType().substring(0, index) + SemiTypeResolverVisitor.ST_ARR + type.getType().substring(index + SemiTypeResolverVisitor.ST_PRO.length()); type = new TypeUsage(newType, type.getOffset(), false); } variable.addAssignment(type, forNode.getModify().getStart()); } } } return super.enterForNode(forNode); }
@Override public boolean enterAccessNode(AccessNode accessNode) { BinaryNode node = getPath().get(getPath().size() - 1) instanceof BinaryNode ? (BinaryNode)getPath().get(getPath().size() - 1) : null; if (!(node != null && node.tokenType() == TokenType.ASSIGN)) { if (accessNode.getBase() instanceof IdentNode && ModelUtils.THIS.equals(((IdentNode)accessNode.getBase()).getName())) { //NOI18N String iNode = accessNode.getProperty(); JsObject current = modelBuilder.getCurrentDeclarationFunction(); JsObject property = current.getProperty(iNode); if (property == null && current.getParent() != null && (current.getParent().getJSKind() == JsElement.Kind.CONSTRUCTOR || current.getParent().getJSKind() == JsElement.Kind.OBJECT)) { current = current.getParent(); property = current.getProperty(iNode); if (property == null && ModelUtils.PROTOTYPE.equals(current.getName())) { current = current.getParent(); property = current.getProperty(iNode); } } if (property == null && current.getParent() == null) { // probably we are in global space and there is used this property = modelBuilder.getGlobal().getProperty(iNode); } if (property != null && !property.getModifiers().contains(Modifier.PRIVATE)) { // we don't want to add occurrences for cases like var buf = this.buf. See issue #267694 ((JsObjectImpl)property).addOccurrence(new OffsetRange(accessNode.getFinish() - iNode.length(), accessNode.getFinish())); } } } return super.enterAccessNode(accessNode); }
@Override public Node leaveBinaryNode(BinaryNode binaryNode) { Node lhs = binaryNode.lhs(); Node rhs = binaryNode.rhs(); if (lhs instanceof IdentNode && rhs instanceof BinaryNode) { Node rlhs = ((BinaryNode)rhs).lhs(); if (rlhs instanceof IdentNode) { JsObject origFunction = modelBuilder.getCurrentDeclarationFunction().getProperty(((IdentNode)rlhs).getName()); if (origFunction != null && origFunction.getJSKind().isFunction()) { JsObject refFunction = modelBuilder.getCurrentDeclarationFunction().getProperty(((IdentNode)lhs).getName()); if (refFunction != null && !refFunction.getJSKind().isFunction()) { JsFunctionReference newReference = new JsFunctionReference(refFunction.getParent(), refFunction.getDeclarationName(), (JsFunction)origFunction, true, origFunction.getModifiers()); refFunction.getParent().addProperty(newReference.getName(), newReference); } } } } return super.leaveBinaryNode(binaryNode); }
private void handleDeclaredFunction(DeclarationScopeImpl inScope, JsObject parent, FunctionNode fnNode) { LOGGER.log(Level.FINEST, " function: " + debugInfo(fnNode)); // NOI18N String name = fnNode.isAnonymous() ? modelBuilder.getFunctionName(fnNode) : fnNode.getIdent().getName(); Identifier fnName = new Identifier(name, new OffsetRange(fnNode.getIdent().getStart(), fnNode.getIdent().getFinish())); if (fnNode.isClassConstructor() && !ModelUtils.CONSTRUCTOR.equals(fnName.getName())) { // skip artifical/ syntetic constructor nodes, that are created // when a class extends different class return; } // process parameters List<Identifier> parameters = new ArrayList(fnNode.getParameters().size()); for(IdentNode node: fnNode.getParameters()) { Identifier param = create(parserResult, node); if (param != null && !node.isDestructuredParameter()) { // can be null, if it's a generated embeding. parameters.add(param); } } // The parent can be changed in the later processing JsFunctionImpl declaredFn = new JsFunctionImpl(inScope, parent, fnName, parameters, getOffsetRange(fnNode), inScope.getMimeType(), inScope.getSourceLabel()); inScope.addProperty(modelBuilder.getFunctionName(fnNode), declaredFn); if (fnName.getOffsetRange().getLength() > 0 && !fnNode.isNamedFunctionExpression()) { declaredFn.addOccurrence(fnName.getOffsetRange()); } }
IdentNode exported = esNode.getExportIdentifier(); IdentNode local = esNode.getIdentifier(); JsObjectImpl property = (JsObjectImpl)modelBuilder.getCurrentDeclarationFunction().getProperty(local.getName()); if (exported == null) { if (property == null) { TypeUsage type = new TypeUsage(local.getName(), local.getFinish()); property.addAssignment(type, local.getFinish());
} else if ((lastVisited instanceof VarNode) && fn.isAnonymous()) { VarNode vNode = (VarNode)lastVisited; newIdentifier = new Identifier(vNode.getName().getName(), getOffsetRange(vNode.getName())); } else if (fn.isAnonymous() && lastVisited instanceof JoinPredecessorExpression && getPreviousFromPath(3) instanceof BinaryNode newIdentifier = new Identifier(vNode.getName().getName(), getOffsetRange(vNode.getName()));