public boolean visit(Assignment assignment) throws Exception { Expression left = assignment.getVariable(); if (left instanceof FieldAccess) { // class variable ($this->a = .) FieldAccess fieldAccess = (FieldAccess) left; Expression dispatcher = fieldAccess.getDispatcher(); if (dispatcher instanceof VariableReference && "$this".equals(((VariableReference) dispatcher).getName())) { // $NON-NLS-1$ Expression field = fieldAccess.getField(); if (field instanceof SimpleReference) { SimpleReference var = (SimpleReference) field; int modifiers = Modifiers.AccPublic; int offset = var.sourceStart(); int length = var.sourceEnd() - offset; StringBuilder metadata = new StringBuilder(); if (fCurrentQualifier != null) { metadata.append(fCurrentQualifierCounts.get(fCurrentQualifier)); metadata.append(";"); // $NON-NLS-1$ } modifyDeclaration( assignment, new DeclarationInfo( IModelElement.FIELD, modifiers, offset, length, offset, length, '$' + var.getName(), metadata.length() == 0 ? null : metadata.toString(), null, fCurrentQualifier, fCurrentParent)); } } } else if (left instanceof VariableReference) { int modifiers = Modifiers.AccPublic | Modifiers.AccGlobal; if (!declarations.empty() && declarations.peek() instanceof MethodDeclaration && !methodGlobalVars.peek().contains(((VariableReference) left).getName())) { return visitGeneral(assignment); } int offset = left.sourceStart(); int length = left.sourceEnd() - offset; modifyDeclaration( assignment, new DeclarationInfo( IModelElement.FIELD, modifiers, offset, length, offset, length, ((VariableReference) left).getName(), null, null, null, null)); } return visitGeneral(assignment); }
public boolean visit(PHPFieldDeclaration decl) throws Exception { // This is variable declaration: int modifiers = markAsDeprecated(decl.getModifiers(), decl); StringBuilder metadata = new StringBuilder(); if (fCurrentQualifier != null) { metadata.append(fCurrentQualifierCounts.get(fCurrentQualifier)); metadata.append(";"); // $NON-NLS-1$ } modifyDeclaration( decl, new DeclarationInfo( IModelElement.FIELD, modifiers, decl.sourceStart(), decl.sourceEnd() - decl.sourceStart(), decl.getNameStart(), decl.getNameEnd() - decl.getNameStart(), decl.getName(), metadata.length() == 0 ? null : metadata.toString(), encodeDocInfo(decl), fCurrentQualifier, fCurrentParent)); return visitGeneral(decl); }
public boolean visit(ConstantDeclaration declaration) throws Exception { int modifiers = Modifiers.AccConstant | Modifiers.AccPublic | Modifiers.AccFinal; if (fCurrentParent != null) { modifiers = modifiers | PHPCoreConstants.AccClassField; } modifiers = markAsDeprecated(modifiers, declaration); ConstantReference constantName = declaration.getConstantName(); int offset = constantName.sourceStart(); int length = constantName.sourceEnd(); StringBuilder metadata = new StringBuilder(); if (fCurrentQualifier != null) { metadata.append(fCurrentQualifierCounts.get(fCurrentQualifier)); metadata.append(";"); // $NON-NLS-1$ } modifyDeclaration( declaration, new DeclarationInfo( IModelElement.FIELD, modifiers, offset, length, offset, length, ASTUtils.stripQuotes(constantName.getName()), metadata.length() == 0 ? null : metadata.toString(), encodeDocInfo(declaration), fCurrentQualifier, fCurrentParent)); return visitGeneral(declaration); }
/** * See {@link PhpElementResolver#decodeDocInfo(String)} for the decoding routine. * * @param declaration Declaration ASTNode * @return decoded PHPDoc info, or <code>null</code> if there's no PHPDoc info to store. */ protected static String encodeDocInfo(Declaration declaration) { if (declaration instanceof IPHPDocAwareDeclaration) { PHPDocBlock docBlock = ((IPHPDocAwareDeclaration) declaration).getPHPDoc(); if (docBlock != null) { Map<String, String> info = new HashMap<String, String>(); for (PHPDocTag tag : docBlock.getTags()) { if (tag.getTagKind() == PHPDocTag.DEPRECATED) { info.put("d", null); // $NON-NLS-1$ } else if (tag.getTagKind() == PHPDocTag.RETURN) { StringBuilder buf = new StringBuilder(); for (TypeReference ref : tag.getTypeReferences()) { String type = ref.getName().replaceAll(",", "~"); // $NON-NLS-1$ //$NON-NLS-2$ if (buf.length() > 0) { buf.append(','); } buf.append(type); } info.put("r", buf.toString()); // $NON-NLS-1$ } else if (tag.getTagKind() == PHPDocTag.VAR) { if (tag.getTypeReferences().size() > 0) { String typeNames = PHPModelUtils.appendTypeReferenceNames(tag.getTypeReferences()); typeNames = typeNames.replace(Constants.TYPE_SEPERATOR_CHAR, Constants.DOT); info.put("v", typeNames); // $NON-NLS-1$ } } } return encodeDocInfo(info); } } return null; }
protected static String encodeDocInfo(Map<String, String> info) { if (info == null) { return null; } StringBuilder buf = new StringBuilder(); for (Entry<String, String> e : info.entrySet()) { if (buf.length() > 0) { buf.append(';'); } buf.append(e.getKey()); if (e.getValue() != null) { buf.append(':').append(e.getValue()); } } return buf.length() > 0 ? buf.toString() : null; }
/** * Resolve class members that were defined using the @property tag * * @param type declaration for wich we add the magic variables */ private void resolveMagicMembers(TypeDeclaration type) { if (type instanceof IPHPDocAwareDeclaration) { IPHPDocAwareDeclaration declaration = (IPHPDocAwareDeclaration) type; final PHPDocBlock doc = declaration.getPHPDoc(); if (doc != null) { for (PHPDocTag docTag : doc.getTags()) { final int tagKind = docTag.getTagKind(); if (tagKind == PHPDocTag.PROPERTY || tagKind == PHPDocTag.PROPERTY_READ || tagKind == PHPDocTag.PROPERTY_WRITE) { // http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.property.pkg.html final String[] split = WHITESPACE_SEPERATOR.split(docTag.getValue().trim()); if (split.length < 2) { break; } String name = removeParenthesis(split); int offset = docTag.sourceStart(); int length = docTag.sourceStart() + 9; Map<String, String> info = new HashMap<String, String>(); info.put("v", split[0]); // $NON-NLS-1$ StringBuilder metadata = new StringBuilder(); if (fCurrentQualifier != null) { metadata.append(fCurrentQualifierCounts.get(fCurrentQualifier)); metadata.append(";"); // $NON-NLS-1$ } modifyDeclaration( null, new DeclarationInfo( IModelElement.FIELD, Modifiers.AccPublic, offset, length, offset, length, name, metadata.length() == 0 ? null : metadata.toString(), encodeDocInfo(info), fCurrentQualifier, fCurrentParent)); } else if (tagKind == PHPDocTag.METHOD) { // http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.method.pkg.html String[] split = WHITESPACE_SEPERATOR.split(docTag.getValue().trim()); if (split.length < 2) { break; } int methodModifiers = Modifiers.AccPublic; if (Constants.STATIC.equals(split[0].trim())) { if (split.length < 3) { break; } methodModifiers |= Modifiers.AccStatic; split = Arrays.copyOfRange(split, 1, split.length); } String name = removeParenthesis(split); int index = name.indexOf('('); if (index > 0) { name = name.substring(0, index); } int offset = docTag.sourceStart(); int length = docTag.sourceStart() + 6; Map<String, String> info = new HashMap<String, String>(); info.put("r", split[0]); // $NON-NLS-1$ StringBuilder metadata = new StringBuilder(); if (fCurrentQualifier != null) { metadata.append(fCurrentQualifierCounts.get(fCurrentQualifier)); metadata.append(";"); // $NON-NLS-1$ } modifyDeclaration( null, new DeclarationInfo( IModelElement.METHOD, methodModifiers, offset, length, offset, length, name, metadata.length() == 0 ? null : metadata.toString(), encodeDocInfo(info), fCurrentQualifier, fCurrentParent)); } } } } }
public boolean visit(TypeDeclaration type) throws Exception { if (type instanceof NamespaceDeclaration) { NamespaceDeclaration namespaceDecl = (NamespaceDeclaration) type; fCurrentNamespace = namespaceDecl; fLastUseParts.clear(); if (namespaceDecl.isGlobal()) { return visitGeneral(type); } declarations.push(type); int modifiers = type.getModifiers() | Modifiers.AccNameSpace; fCurrentQualifier = type.getName(); Integer count = fCurrentQualifierCounts.get(fCurrentQualifier); count = count != null ? count + 1 : 1; fCurrentQualifierCounts.put(fCurrentQualifier, count); modifiers = markAsDeprecated(modifiers, type); StringBuilder metadata = new StringBuilder(); if (fCurrentQualifier != null) { metadata.append(fCurrentQualifierCounts.get(fCurrentQualifier)); metadata.append(";"); // $NON-NLS-1$ } modifyDeclaration( type, new DeclarationInfo( IModelElement.PACKAGE_DECLARATION, modifiers, type.sourceStart(), type.sourceEnd() - type.sourceStart(), type.getNameStart(), type.getNameEnd() - type.getNameStart(), type.getName(), metadata.length() == 0 ? null : metadata.toString(), encodeDocInfo(type), null, null)); } else { Declaration parentDeclaration = null; if (!declarations.empty()) { parentDeclaration = declarations.peek(); } declarations.push(type); if (!(parentDeclaration instanceof NamespaceDeclaration)) { type.setModifier(Modifiers.AccGlobal); } // In case we are entering a nested element if (parentDeclaration instanceof MethodDeclaration) { if (fCurrentNamespace == null) { deferredDeclarations.add(type); } else { deferredNamespacedDeclarations.add(type); } return visitGeneral(type); } int modifiers = type.getModifiers(); fCurrentParent = type.getName(); String[] superClasses = processSuperClasses(type); StringBuilder metadata = new StringBuilder(); if (fCurrentQualifier != null) { metadata.append(fCurrentQualifierCounts.get(fCurrentQualifier)); metadata.append(";"); // $NON-NLS-1$ } for (int i = 0; i < superClasses.length; ++i) { metadata.append(superClasses[i]); if (i < superClasses.length - 1) { metadata.append(","); // $NON-NLS-1$ } } modifiers = markAsDeprecated(modifiers, type); modifyDeclaration( type, new DeclarationInfo( IModelElement.TYPE, modifiers, type.sourceStart(), type.sourceEnd() - type.sourceStart(), type.getNameStart(), type.getNameEnd() - type.getNameStart(), type.getName(), metadata.length() == 0 ? null : metadata.toString(), encodeDocInfo(type), fCurrentQualifier, null)); } for (PhpIndexingVisitorExtension visitor : extensions) { visitor.visit(type); } return visitGeneral(type); }
@SuppressWarnings("unchecked") public boolean visit(MethodDeclaration method) throws Exception { fNodes.push(method); methodGlobalVars.add(new HashSet<String>()); int modifiers = method.getModifiers(); PHPDocBlock doc = null; if (method instanceof IPHPDocAwareDeclaration) { IPHPDocAwareDeclaration declaration = (IPHPDocAwareDeclaration) method; doc = declaration.getPHPDoc(); } Declaration parentDeclaration = null; if (!declarations.empty()) { parentDeclaration = declarations.peek(); } declarations.push(method); // In case we are entering a nested element - just add to the deferred // list // and get out of the nested element visiting process if (parentDeclaration instanceof MethodDeclaration) { if (fCurrentNamespace == null) { deferredDeclarations.add(method); } else { deferredNamespacedDeclarations.add(method); } return visitGeneral(method); } if (parentDeclaration instanceof InterfaceDeclaration) { method.setModifier(Modifiers.AccAbstract); } String methodName = method.getName(); // Determine whether this method represents constructor: if (methodName.equalsIgnoreCase(CONSTRUCTOR_NAME) || (parentDeclaration instanceof ClassDeclaration && methodName.equalsIgnoreCase(((ClassDeclaration) parentDeclaration).getName()))) { modifiers |= IPHPModifiers.Constructor; } if (parentDeclaration == null || (parentDeclaration instanceof TypeDeclaration && parentDeclaration == fCurrentNamespace)) { modifiers |= Modifiers.AccGlobal; } if (!Flags.isPrivate(modifiers) && !Flags.isProtected(modifiers) && !Flags.isPublic(modifiers)) { modifiers |= Modifiers.AccPublic; } modifiers = markAsDeprecated(modifiers, method); StringBuilder metadata = new StringBuilder(); if (fCurrentQualifier != null) { metadata.append(fCurrentQualifierCounts.get(fCurrentQualifier)); metadata.append(";"); // $NON-NLS-1$ } List<Argument> arguments = method.getArguments(); if (arguments != null) { Iterator<Argument> i = arguments.iterator(); while (i.hasNext()) { Argument arg = (Argument) i.next(); String type = NULL_VALUE; if (arg instanceof FormalParameter) { FormalParameter fp = (FormalParameter) arg; if (fp.getParameterType() != null) { if (fp.getParameterType().getName() != null) { type = fp.getParameterType().getName(); } } } if (type == NULL_VALUE && doc != null) { type = getParamType(doc, arg.getName(), type); } metadata.append(type); metadata.append(PARAMETER_SEPERATOR); metadata.append(arg.getName()); metadata.append(PARAMETER_SEPERATOR); String defaultValue = NULL_VALUE; if (arg.getInitialization() != null) { if (arg.getInitialization() instanceof Literal) { Literal scalar = (Literal) arg.getInitialization(); defaultValue = scalar.getValue(); } else { defaultValue = DEFAULT_VALUE; } } metadata.append(defaultValue); if (i.hasNext()) { metadata.append(","); // $NON-NLS-1$ } } } // Add method declaration: modifyDeclaration( method, new DeclarationInfo( IModelElement.METHOD, modifiers, method.sourceStart(), method.sourceEnd() - method.sourceStart(), method.getNameStart(), method.getNameEnd() - method.getNameStart(), methodName, metadata.length() == 0 ? null : metadata.toString(), encodeDocInfo(method), fCurrentQualifier, fCurrentParent)); for (PhpIndexingVisitorExtension visitor : extensions) { visitor.visit(method); } return visitGeneral(method); }
/** * Resolve class members that were defined using the @property tag * * @param type declaration for wich we add the magic variables */ private void resolveMagicMembers(TypeDeclaration type) { if (type instanceof IPHPDocAwareDeclaration) { IPHPDocAwareDeclaration declaration = (IPHPDocAwareDeclaration) type; final PHPDocBlock doc = declaration.getPHPDoc(); if (doc != null) { Pattern WHITESPACE_SEPERATOR = MagicMemberUtil.WHITESPACE_SEPERATOR; final PHPDocTag[] tags = doc.getTags(); for (PHPDocTag docTag : tags) { final int tagKind = docTag.getTagKind(); if (tagKind == PHPDocTag.PROPERTY || tagKind == PHPDocTag.PROPERTY_READ || tagKind == PHPDocTag.PROPERTY_WRITE) { // http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.property.pkg.html final String[] split = WHITESPACE_SEPERATOR.split(docTag.getValue().trim()); if (split.length < 2) { continue; } ISourceElementRequestor.FieldInfo info = new ISourceElementRequestor.FieldInfo(); info.modifiers = Modifiers.AccPublic | IPHPModifiers.AccMagicProperty; info.name = split[1]; info.type = split[0]; SimpleReference var = new SimpleReference( docTag.sourceStart(), docTag.sourceStart() + 9, removeParenthesis(split)); info.nameSourceStart = var.sourceStart(); info.nameSourceEnd = var.sourceEnd(); info.declarationStart = info.nameSourceStart; fRequestor.enterField(info); fRequestor.exitField(info.nameSourceEnd); } else if (tagKind == PHPDocTag.METHOD) { // http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.method.pkg.html // workaround for lack of method return type int methodModifiers = Modifiers.AccPublic; String docTagValue = docTag.getValue().trim(); int index = docTagValue.indexOf('('); if (index != -1) { String[] split = WHITESPACE_SEPERATOR.split(docTagValue.substring(0, index).trim()); if (split.length == 1) { docTagValue = new StringBuilder(VOID_RETURN_TYPE) .append(Constants.SPACE) .append(docTagValue) .toString(); } else if (split.length == 2 && Constants.STATIC.equals(split[0])) { StringBuilder sb = new StringBuilder(Constants.STATIC); sb.append(Constants.SPACE).append(VOID_RETURN_TYPE); sb.append(docTagValue.substring(6)); docTagValue = sb.toString(); } } String[] split = WHITESPACE_SEPERATOR.split(docTagValue); if (split.length < 2) { continue; } if (Constants.STATIC.equals(split[0])) { methodModifiers |= Modifiers.AccStatic; split = Arrays.copyOfRange(split, 1, split.length); docTagValue = docTagValue.substring(7).trim(); if (split.length < 2) { continue; } } ISourceElementRequestor.MethodInfo mi = new ISourceElementRequestor.MethodInfo(); mi.parameterNames = null; mi.name = removeParenthesis(split); SimpleReference var = new SimpleReference( docTag.sourceStart(), docTag.sourceStart() + 6, removeParenthesis(split)); mi.modifiers = methodModifiers; mi.nameSourceStart = var.sourceStart(); mi.nameSourceEnd = var.sourceEnd(); mi.declarationStart = mi.nameSourceStart; mi.isConstructor = false; mi.returnType = split[0]; MagicMethod magicMethod; if (mi.name != null && mi.name.indexOf('(') > 0) { magicMethod = MagicMemberUtil.getMagicMethod2(docTagValue); mi.name = magicMethod.name; } else { magicMethod = MagicMemberUtil.getMagicMethod(docTagValue); } if (magicMethod != null) { mi.parameterNames = magicMethod.parameterNames; mi.parameterTypes = magicMethod.parameterTypes; mi.parameterInitializers = magicMethod.parameterInitializers; } this.fRequestor.enterMethod(mi); this.fRequestor.exitMethod(mi.nameSourceEnd); } } } } }
public boolean visit(LambdaFunctionDeclaration lambdaMethod) throws Exception { fNodes.push(lambdaMethod); methodGlobalVars.add(new HashSet<String>()); // Declaration parentDeclaration = null; // if (!declarations.empty() // && declarations.peek() instanceof MethodDeclaration) { // parentDeclaration = declarations.peek(); // // In case we are entering a nested element - just add to the // // deferred list and get out of the nested element visiting process // deferredDeclarations.add(lambdaMethod); // return visitGeneral(lambdaMethod); // } Collection<FormalParameter> arguments = lambdaMethod.getArguments(); StringBuilder metadata = new StringBuilder(); String[] parameters; if (arguments != null) { parameters = new String[arguments.size()]; Iterator<FormalParameter> i = arguments.iterator(); int indx = 0; while (i.hasNext()) { Argument arg = (Argument) i.next(); metadata.append(arg.getName()); parameters[indx] = arg.getName(); indx++; if (i.hasNext()) { metadata.append(","); // $NON-NLS-1$ } } } else { parameters = new String[0]; } // Add method declaration: for (PHPSourceElementRequestorExtension visitor : extensions) { visitor.visit(lambdaMethod); } ISourceElementRequestor.MethodInfo mi = new ISourceElementRequestor.MethodInfo(); mi.parameterNames = parameters; mi.name = PHPCoreConstants.ANONYMOUS; mi.modifiers = Modifiers.AccPublic; if (lambdaMethod.isStatic()) { mi.modifiers |= Modifiers.AccStatic; } mi.nameSourceStart = lambdaMethod.sourceStart(); mi.nameSourceEnd = lambdaMethod.sourceEnd(); mi.declarationStart = mi.nameSourceStart; mi.isConstructor = false; fInfoStack.push(mi); this.fRequestor.enterMethod(mi); this.fInMethod = true; for (Argument arg : arguments) { ISourceElementRequestor.FieldInfo info = new ISourceElementRequestor.FieldInfo(); info.name = arg.getName(); info.modifiers = Modifiers.AccPublic; info.nameSourceStart = arg.getNameStart(); info.nameSourceEnd = arg.getNameEnd() - 1; info.declarationStart = arg.sourceStart(); fRequestor.enterField(info); fRequestor.exitField(arg.sourceEnd() - 1); } return true; }