You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ju...@apache.org on 2023/11/23 10:30:02 UTC
(netbeans) branch php-nb21-features updated: Improve the performance for Go to Declaration
This is an automated email from the ASF dual-hosted git repository.
junichi11 pushed a commit to branch php-nb21-features
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/php-nb21-features by this push:
new de1f2ed5d5 Improve the performance for Go to Declaration
new 0b3757be9b Merge pull request #6712 from junichi11/php-gh-3933-6634-improve-gotodecl
de1f2ed5d5 is described below
commit de1f2ed5d55c0db545d905ea98064585566726b6
Author: Junichi Yamamoto <ju...@apache.org>
AuthorDate: Fri Nov 17 12:07:07 2023 +0900
Improve the performance for Go to Declaration
- https://github.com/apache/netbeans/issues/3933
- https://github.com/apache/netbeans/issues/6634
- Don't add empty type names to avoid getting types from an index using them
---
.../org/netbeans/modules/php/editor/CodeUtils.java | 1 +
.../php/editor/elements/ClassElementImpl.java | 48 ++++++++++++++++++----
.../php/editor/elements/IndexQueryImpl.java | 6 ++-
.../php/editor/elements/TraitElementImpl.java | 15 ++++---
.../php/editor/model/impl/ClassScopeImpl.java | 22 +++++++---
.../php/editor/model/impl/OccurenceBuilder.java | 6 ++-
.../modules/php/editor/parser/api/Utils.java | 17 +++++---
7 files changed, 91 insertions(+), 24 deletions(-)
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java b/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java
index 6d39d06511..cf6488e7e3 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java
@@ -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());
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java
index f2ea7fcf98..cc76f0c792 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java
@@ -25,6 +25,7 @@ import java.util.HashSet;
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;
@@ -47,8 +48,10 @@ import org.openide.util.Parameters;
* @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;
@@ -72,6 +75,28 @@ public final class ClassElementImpl extends TypeElementImpl implements ClassElem
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) {
@@ -81,7 +106,7 @@ public final class ClassElementImpl extends TypeElementImpl implements ClassElem
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) {
@@ -142,6 +167,7 @@ public final class ClassElementImpl extends TypeElementImpl implements ClassElem
return KIND;
}
+ @CheckForNull
@Override
public QualifiedName getSuperClassName() {
return superClass;
@@ -149,7 +175,7 @@ public final class ClassElementImpl extends TypeElementImpl implements ClassElem
@Override
public Collection<QualifiedName> getPossibleFQSuperClassNames() {
- return this.possibleFQSuperClassNames;
+ return Collections.unmodifiableCollection(possibleFQSuperClassNames);
}
@Override
@@ -293,7 +319,7 @@ public final class ClassElementImpl extends TypeElementImpl implements ClassElem
@Override
public Collection<QualifiedName> getUsedTraits() {
- return usedTraits;
+ return Collections.unmodifiableCollection(usedTraits);
}
private static class ClassSignatureParser {
@@ -382,9 +408,13 @@ public final class ClassElementImpl extends TypeElementImpl implements ClassElem
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;
}
@@ -400,9 +430,13 @@ public final class ClassElementImpl extends TypeElementImpl implements ClassElem
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;
}
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java
index ce32a25622..961dc19c63 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java
@@ -42,6 +42,7 @@ import org.netbeans.modules.php.api.editor.PhpBaseElement;
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;
@@ -1254,6 +1255,9 @@ public final class IndexQueryImpl implements ElementQuery.Index {
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())));
@@ -1298,7 +1302,7 @@ public final class IndexQueryImpl implements ElementQuery.Index {
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()));
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/elements/TraitElementImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/elements/TraitElementImpl.java
index 41e918fb77..aa42a1e24e 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/elements/TraitElementImpl.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/elements/TraitElementImpl.java
@@ -23,6 +23,7 @@ import java.util.Collections;
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;
@@ -43,7 +44,7 @@ import org.openide.util.Parameters;
*/
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,
@@ -86,7 +87,7 @@ public final class TraitElementImpl extends TypeElementImpl implements TraitElem
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) {
@@ -161,7 +162,7 @@ public final class TraitElementImpl extends TypeElementImpl implements TraitElem
@Override
public Collection<QualifiedName> getUsedTraits() {
- return usedTraits;
+ return Collections.unmodifiableCollection(usedTraits);
}
private static class TraitSignatureParser {
@@ -183,9 +184,13 @@ public final class TraitElementImpl extends TypeElementImpl implements TraitElem
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;
}
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
index 3ae5417edd..d5fde9f8fe 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
@@ -114,7 +114,11 @@ class ClassScopeImpl extends TypeScopeImpl implements ClassScope, VariableNameFa
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));
+ }
}
}
@@ -139,7 +143,12 @@ class ClassScopeImpl extends TypeScopeImpl implements ClassScope, VariableNameFa
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);
+ }
}
}
@@ -493,6 +502,7 @@ class ClassScopeImpl extends TypeScopeImpl implements ClassScope, VariableNameFa
} else {
first = true;
}
+ assert !qualifiedName.getName().isEmpty();
sb.append(qualifiedName.toString());
}
}
@@ -529,6 +539,7 @@ class ClassScopeImpl extends TypeScopeImpl implements ClassScope, VariableNameFa
if (traitSb.length() > 0) {
traitSb.append(","); //NOI18N
}
+ assert !usedTrait.getName().isEmpty();
traitSb.append(usedTrait.toString());
}
sb.append(traitSb);
@@ -542,6 +553,7 @@ class ClassScopeImpl extends TypeScopeImpl implements ClassScope, VariableNameFa
if (mixinSb.length() > 0) {
mixinSb.append(","); // NOI18N
}
+ assert !mixinClassName.getName().isEmpty();
mixinSb.append(mixinClassName.toString());
}
sb.append(mixinSb);
@@ -654,7 +666,7 @@ class ClassScopeImpl extends TypeScopeImpl implements ClassScope, VariableNameFa
@Override
public Collection<QualifiedName> getUsedTraits() {
- return usedTraits;
+ return Collections.unmodifiableCollection(usedTraits);
}
@Override
@@ -748,14 +760,14 @@ class ClassScopeImpl extends TypeScopeImpl implements ClassScope, VariableNameFa
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(" ");
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java
index 67839defc6..4f7d427a2e 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java
@@ -2460,7 +2460,11 @@ class OccurenceBuilder {
}
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) {
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/parser/api/Utils.java b/php/php.editor/src/org/netbeans/modules/php/editor/parser/api/Utils.java
index 22aa07b897..296a372adc 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/parser/api/Utils.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/parser/api/Utils.java
@@ -75,12 +75,19 @@ public final class Utils {
}
}
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;
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists