/******************************************************************************* * Copyright (c) 2006 Zend Corporation and IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * William Candillon {wcandillon@gmail.com} - Initial implementation *******************************************************************************/ package org.eclipse.php.internal.ui.editor.highlighters; import java.util.List; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.SourceParserUtil; import org.eclipse.php.core.ast.nodes.*; import org.eclipse.php.internal.core.search.AbstractOccurrencesFinder; import org.eclipse.php.internal.core.typeinference.PHPClassType; import org.eclipse.php.internal.core.typeinference.PHPTypeInferenceUtils; import org.eclipse.php.internal.core.typeinference.context.FileContext; import org.eclipse.php.internal.ui.editor.highlighter.AbstractSemanticApply; import org.eclipse.php.internal.ui.editor.highlighter.AbstractSemanticHighlighting; import org.eclipse.php.internal.ui.editor.highlighter.ModelUtils; import org.eclipse.swt.graphics.RGB; public class InternalClassHighlighting extends AbstractSemanticHighlighting { protected class InternalClassApply extends AbstractSemanticApplyWithNS { public InternalClassApply(ISourceModule sourceModule) { super(sourceModule); } @Override public boolean visit(CatchClause catchStatement) { List<Expression> classNames = catchStatement.getClassNames(); for (Expression className : classNames) { if (className instanceof Identifier) { dealIdentifier((Identifier) className); } } return true; } @Override public boolean visit(StaticConstantAccess staticDispatch) { Expression className = staticDispatch.getClassName(); if (className instanceof Identifier) { dealIdentifier((Identifier) className); } return false; } @Override public boolean visit(StaticFieldAccess staticDispatch) { Expression className = staticDispatch.getClassName(); if (className instanceof Identifier) { dealIdentifier((Identifier) className); } return false; } @Override public boolean visit(StaticMethodInvocation staticDispatch) { Expression className = staticDispatch.getClassName(); if (className instanceof Identifier) { dealIdentifier((Identifier) className); } return true; } @Override public boolean visit(ClassName className) { if (className.getName() instanceof Identifier) { Identifier identifier = (Identifier) className.getName(); dealIdentifier(identifier); } return false; } @Override public boolean visit(ClassDeclaration classDeclaration) { checkSuper(classDeclaration.getSuperClass(), classDeclaration.interfaces()); return true; } @Override public boolean visit(TraitDeclaration traitDeclaration) { checkSuper(traitDeclaration.getSuperClass(), traitDeclaration.interfaces()); return true; } /** * Checks if the supers are with the name of the class * * @param superClass * @param interfaces */ private void checkSuper(Expression superClass, List<Identifier> interfaces) { if (superClass instanceof Identifier) { dealIdentifier((Identifier) superClass); } if (interfaces != null) { for (Identifier identifier : interfaces) { dealIdentifier(identifier); } } } /** * @param identifier */ private void dealIdentifier(Identifier identifier) { NamespaceDeclaration namespace = fCurrentNamespace; if (identifier instanceof NamespaceName) { NamespaceName namespaceName = (NamespaceName) identifier; if (namespaceName.isGlobal()) { namespace = null; } } String fullName = AbstractOccurrencesFinder.getFullName(identifier, fLastUseParts, namespace); FileContext context = new FileContext(getSourceModule(), SourceParserUtil.getModuleDeclaration(getSourceModule(), null), identifier.getStart()); IModelElement[] elements = PHPTypeInferenceUtils.getModelElements( PHPClassType.fromTypeName(fullName, getSourceModule(), identifier.getStart()), context, identifier.getAST().getBindingResolver().getModelAccessCache()); /* * PhpModelAccess.getDefault().findTypes( fullName, MatchRule.EXACT, * 0, 0, createSearchScope(), null); */ if (elements != null && elements.length == 1 && elements[0] != null) { if (ModelUtils.isExternalElement(elements[0])) { highlight(identifier); } } } } @Override public AbstractSemanticApply getSemanticApply() { return new InternalClassApply(getSourceModule()); } @Override protected void initDefaultPreferences() { getStyle().setEnabledByDefault(false).setDefaultTextColor(new RGB(0, 0, 192)); } @Override public String getDisplayName() { return Messages.InternalClassHighlighting_0; } @Override public int getPriority() { return 110; } // // private boolean isInternalClass(Identifier type) { // try { // ISourceModule module = getSourceModule(); // // there is no internal class for external file // // https://bugs.eclipse.org/bugs/show_bug.cgi?id=322466 // if (module.getScriptProject().getProject().getName().trim() // .length() == 0) { // return false; // } // IModelElement[] elements = module.codeSelect(type.getStart(), // type.getLength()); // if (elements != null && elements.length == 1 && elements[0] != null) { // IModelElement element = (IModelElement) elements[0]; // return ModelUtils.isExternalElement(element); // } // } catch (ModelException e) { // Logger.logException(e); // } // return false; // } }