Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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