Skip to content

Commit

Permalink
Merge pull request apache#6712 from junichi11/php-gh-3933-6634-improv…
Browse files Browse the repository at this point in the history
…e-gotodecl

PHP: Improve the performance for Go to Declaration
  • Loading branch information
junichi11 committed Nov 23, 2023
2 parents e91ac62 + de1f2ed commit 0b3757b
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ public final class CodeUtils {
public static final Pattern WHITE_SPACES_PATTERN = Pattern.compile("\\s+"); // NOI18N
public static final Pattern SPLIT_TYPES_PATTERN = Pattern.compile("[()|&]+"); // NOI18N
public static final Pattern TYPE_NAMES_IN_TYPE_DECLARATION_PATTERN = Pattern.compile("[^?()|&]+"); // NOI18N
public static final Pattern COMMA_PATTERN = Pattern.compile(","); // NOI18N

private static final Logger LOGGER = Logger.getLogger(CodeUtils.class.getName());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.Set;
import java.util.StringTokenizer;
import org.netbeans.api.annotations.common.CheckForNull;
import org.netbeans.api.annotations.common.NullAllowed;
import org.netbeans.modules.parsing.spi.indexing.support.IndexResult;
import org.netbeans.modules.php.api.editor.PhpClass;
import org.netbeans.modules.php.editor.CodeUtils;
Expand All @@ -47,8 +48,10 @@
* @author Radek Matous
*/
public final class ClassElementImpl extends TypeElementImpl implements ClassElement {

public static final String IDX_FIELD = PHPIndexer.FIELD_CLASS;

@NullAllowed
private final QualifiedName superClass;
private final Collection<QualifiedName> possibleFQSuperClassNames;
private final Collection<QualifiedName> fqMixinClassNames;
Expand All @@ -72,6 +75,28 @@ private ClassElementImpl(
this.possibleFQSuperClassNames = possibleFQSuperClassNames;
this.usedTraits = usedTraits;
this.fqMixinClassNames = fqMixinClassNames;
checkTypeNames();
}

private void checkTypeNames() {
// GH-6634
// avoid getting types from the index with an empty string
boolean checkEnabled = false;
assert checkEnabled = true;
if (checkEnabled) {
if (superClass != null) {
assert !superClass.getName().isEmpty();
}
for (QualifiedName name : possibleFQSuperClassNames) {
assert !name.getName().isEmpty();
}
for (QualifiedName usedTrait : usedTraits) {
assert !usedTrait.getName().isEmpty();
}
for (QualifiedName className : fqMixinClassNames) {
assert !className.getName().isEmpty();
}
}
}

public static Set<ClassElement> fromSignature(final IndexQueryImpl indexScopeQuery, final IndexResult indexResult) {
Expand All @@ -81,7 +106,7 @@ public static Set<ClassElement> fromSignature(final IndexQueryImpl indexScopeQue
public static Set<ClassElement> fromSignature(final NameKind query,
final IndexQueryImpl indexScopeQuery, final IndexResult indexResult) {
String[] values = indexResult.getValues(IDX_FIELD);
Set<ClassElement> retval = values.length > 0 ? new HashSet<ClassElement>() : Collections.<ClassElement>emptySet();
Set<ClassElement> retval = values.length > 0 ? new HashSet<>() : Collections.<ClassElement>emptySet();
for (String val : values) {
final ClassElement clz = fromSignature(query, indexScopeQuery, Signature.get(val));
if (clz != null) {
Expand Down Expand Up @@ -142,14 +167,15 @@ public PhpElementKind getPhpElementKind() {
return KIND;
}

@CheckForNull
@Override
public QualifiedName getSuperClassName() {
return superClass;
}

@Override
public Collection<QualifiedName> getPossibleFQSuperClassNames() {
return this.possibleFQSuperClassNames;
return Collections.unmodifiableCollection(possibleFQSuperClassNames);
}

@Override
Expand Down Expand Up @@ -293,7 +319,7 @@ public boolean isAnonymous() {

@Override
public Collection<QualifiedName> getUsedTraits() {
return usedTraits;
return Collections.unmodifiableCollection(usedTraits);
}

private static class ClassSignatureParser {
Expand Down Expand Up @@ -382,9 +408,13 @@ int getFlags() {
public Collection<QualifiedName> getUsedTraits() {
Collection<QualifiedName> retval = new HashSet<>();
String traits = signature.string(7);
final String[] traitNames = traits.split(Separator.COMMA.toString());
final String[] traitNames = CodeUtils.COMMA_PATTERN.split(traits);
for (String trait : traitNames) {
retval.add(QualifiedName.create(trait));
if (!trait.isEmpty()) {
// GH-6634
// avoid getting traits from the index with an empty string
retval.add(QualifiedName.create(trait));
}
}
return retval;
}
Expand All @@ -400,9 +430,13 @@ String getFileUrl() {
public Collection<QualifiedName> getFQMixinClassNames() {
Collection<QualifiedName> retval = new HashSet<>();
String mixins = signature.string(10);
final String[] mixinNames = mixins.split(Separator.COMMA.toString());
final String[] mixinNames = CodeUtils.COMMA_PATTERN.split(mixins);
for (String mixinName : mixinNames) {
retval.add(QualifiedName.create(mixinName));
if (!mixinName.isEmpty()) {
// GH-6634
// avoid getting mixins from the index with an empty string
retval.add(QualifiedName.create(mixinName));
}
}
return retval;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import org.netbeans.modules.php.api.editor.PhpClass;
import org.netbeans.modules.php.api.editor.PhpType;
import org.netbeans.modules.php.api.editor.PhpVariable;
import org.netbeans.modules.php.api.util.StringUtils;
import org.netbeans.modules.php.editor.api.AbstractElementQuery;
import org.netbeans.modules.php.editor.api.AliasedName;
import org.netbeans.modules.php.editor.api.ElementQuery;
Expand Down Expand Up @@ -1254,6 +1255,9 @@ private Set<TypeMemberElement> getDirectInheritedTypeMembers(final TypeElement t
TraitedElement traitedElement = (TraitedElement) typeElement;
Collection<QualifiedName> usedTraits = traitedElement.getUsedTraits();
for (QualifiedName trait : usedTraits) {
if (StringUtils.isEmpty(trait.getName())) {
continue;
}
final Set<TypeMemberElement> traitTypes = new LinkedHashSet<>();
if (memberKinds.size() != 1) {
traitTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(getTypeMembers(NameKind.exact(trait), NameKind.empty())));
Expand Down Expand Up @@ -1298,7 +1302,7 @@ private Set<TypeMemberElement> getDirectMixinTypeMembers(final TypeElement typeE

private Set<TypeMemberElement> getDirectInheritedClassTypes(QualifiedName superClassName, EnumSet<PhpElementKind> memberKinds, final TypeElement typeElement) {
final Set<TypeMemberElement> classTypes = new LinkedHashSet<>();
if (superClassName != null) {
if (superClassName != null && !StringUtils.isEmpty(superClassName.getName())) {
classTypes.addAll(extendedQuery.getFields(NameKind.exact(superClassName), NameKind.empty()));
classTypes.addAll(extendedQuery.getMethods(NameKind.exact(superClassName), NameKind.empty()));
classTypes.addAll(extendedQuery.getTypeConstants(NameKind.exact(superClassName), NameKind.empty()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.HashSet;
import java.util.Set;
import org.netbeans.modules.parsing.spi.indexing.support.IndexResult;
import org.netbeans.modules.php.editor.CodeUtils;
import org.netbeans.modules.php.editor.api.ElementQuery;
import org.netbeans.modules.php.editor.api.NameKind;
import org.netbeans.modules.php.editor.api.PhpElementKind;
Expand All @@ -43,7 +44,7 @@
*/
public final class TraitElementImpl extends TypeElementImpl implements TraitElement {
public static final String IDX_FIELD = PHPIndexer.FIELD_TRAIT;
private Collection<QualifiedName> usedTraits;
private final Collection<QualifiedName> usedTraits;

private TraitElementImpl(
final QualifiedName qualifiedName,
Expand Down Expand Up @@ -86,7 +87,7 @@ private static TraitElement fromSignature(NameKind query, IndexQueryImpl indexSc

public static Set<TraitElement> fromSignature(final NameKind query, final IndexQueryImpl indexScopeQuery, final IndexResult indexResult) {
String[] values = indexResult.getValues(IDX_FIELD);
Set<TraitElement> retval = values.length > 0 ? new HashSet<TraitElement>() : Collections.<TraitElement>emptySet();
Set<TraitElement> retval = values.length > 0 ? new HashSet<>() : Collections.<TraitElement>emptySet();
for (String val : values) {
final TraitElement trait = fromSignature(query, indexScopeQuery, Signature.get(val));
if (trait != null) {
Expand Down Expand Up @@ -161,7 +162,7 @@ public String asString(PrintAs as) {

@Override
public Collection<QualifiedName> getUsedTraits() {
return usedTraits;
return Collections.unmodifiableCollection(usedTraits);
}

private static class TraitSignatureParser {
Expand All @@ -183,9 +184,13 @@ int getOffset() {
private Collection<QualifiedName> getUsedTraits() {
Collection<QualifiedName> retval = new HashSet<>();
String traits = signature.string(4);
final String[] traitNames = traits.split(Separator.COMMA.toString());
final String[] traitNames = CodeUtils.COMMA_PATTERN.split(traits);
for (String trait : traitNames) {
retval.add(QualifiedName.create(trait));
if (!trait.isEmpty()) {
// GH-6634
// avoid getting traits from the index with an empty string
retval.add(QualifiedName.create(trait));
}
}
return retval;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,11 @@ void addElement(ModelElementImpl element) {
this.superClass = Union2.<String, List<ClassScopeImpl>>createFirst(null);
}
for (QualifiedName usedTrait : nodeInfo.getUsedTraits()) {
usedTraits.add(VariousUtils.getFullyQualifiedName(usedTrait, nodeInfo.getOriginalNode().getStartOffset(), inScope));
if (!usedTrait.getName().isEmpty()) {
// GH-6634
// avoid getting traits from the index with an empty string
usedTraits.add(VariousUtils.getFullyQualifiedName(usedTrait, nodeInfo.getOriginalNode().getStartOffset(), inScope));
}
}
}

Expand All @@ -139,7 +143,12 @@ void addElement(ModelElementImpl element) {
this.superClass = Union2.<String, List<ClassScopeImpl>>createFirst(null);
}
for (QualifiedName usedTrait : nodeInfo.getUsedTraits()) {
usedTraits.add(VariousUtils.getFullyQualifiedName(usedTrait, nodeInfo.getOriginalNode().getStartOffset(), inScope));
QualifiedName fullyQualifiedName = VariousUtils.getFullyQualifiedName(usedTrait, nodeInfo.getOriginalNode().getStartOffset(), inScope);
if (!fullyQualifiedName.getName().isEmpty()) {
// GH-6634
// avoid getting traits from the index with an empty string
usedTraits.add(fullyQualifiedName);
}
}
}

Expand Down Expand Up @@ -493,6 +502,7 @@ public String getIndexSignature() {
} else {
first = true;
}
assert !qualifiedName.getName().isEmpty();
sb.append(qualifiedName.toString());
}
}
Expand Down Expand Up @@ -529,6 +539,7 @@ public String getIndexSignature() {
if (traitSb.length() > 0) {
traitSb.append(","); //NOI18N
}
assert !usedTrait.getName().isEmpty();
traitSb.append(usedTrait.toString());
}
sb.append(traitSb);
Expand All @@ -542,6 +553,7 @@ public String getIndexSignature() {
if (mixinSb.length() > 0) {
mixinSb.append(","); // NOI18N
}
assert !mixinClassName.getName().isEmpty();
mixinSb.append(mixinClassName.toString());
}
sb.append(mixinSb);
Expand Down Expand Up @@ -654,7 +666,7 @@ public boolean isAnonymous() {

@Override
public Collection<QualifiedName> getUsedTraits() {
return usedTraits;
return Collections.unmodifiableCollection(usedTraits);
}

@Override
Expand Down Expand Up @@ -748,14 +760,14 @@ public String toString() {
sb.append(" extends ").append(extClass.getName()); //NOI18N
}
List<? extends InterfaceScope> implementedInterfaces = getSuperInterfaceScopes();
if (implementedInterfaces.size() > 0) {
if (!implementedInterfaces.isEmpty()) {
sb.append(" implements "); //NOI18N
for (InterfaceScope interfaceScope : implementedInterfaces) {
sb.append(interfaceScope.getName()).append(" ");
}
}
Collection<? extends TraitScope> traits = getTraits();
if (traits.size() > 0) {
if (!traits.isEmpty()) {
sb.append(" uses "); //NOI18N
for (TraitScope traitScope : traits) {
sb.append(traitScope.getName()).append(" ");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2460,7 +2460,11 @@ private void buildVariables(ElementInfo nodeCtxInfo, FileScopeImpl fileScope, fi
}
ASTNodeInfo<Variable> nodeInfo = entry.getKey();
boolean addOccurence = false;
if (NameKind.exact(nodeInfo.getName()).matchesName(PhpElementKind.VARIABLE, nodeName)) {
String name = nodeInfo.getName();
if (!StringUtils.hasText(name)) {
continue;
}
if (NameKind.exact(name).matchesName(PhpElementKind.VARIABLE, nodeName)) {
if (!var.isGloballyVisible()) {
Scope nextScope = entry.getValue();
if (var.representsThis() && nextScope.getInScope() instanceof TypeScope) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,19 @@ public static Comment getCommentForNode(Program root, ASTNode node) {
}
}
if (possible != null && (possible.getEndOffset() + 1 < node.getStartOffset())) {
List<ASTNode> nodes = (new NodeRangeLocator()).locate(root, new OffsetRange(possible.getEndOffset() + 1, getNodeRangeLocatorEndOffset(node)));
if (!nodes.isEmpty()) {
if (!isConstantDeclaration(nodes, node)
&& !isFieldDeclaration(nodes, node)) {
possible = null;
int start = possible.getEndOffset() + 1;
int end = getNodeRangeLocatorEndOffset(node);
if (start <= end) {
List<ASTNode> nodes = (new NodeRangeLocator()).locate(root, new OffsetRange(start, end));
if (!nodes.isEmpty()) {
if (!isConstantDeclaration(nodes, node)
&& !isFieldDeclaration(nodes, node)) {
possible = null;
}
}
} else {
// e.g. public self|A /* comment */ |null $unionType; (start > end)
possible = null;
}
}
}
Expand Down

0 comments on commit 0b3757b

Please sign in to comment.