/* * Copyright 2013-2017 consulo.io * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package consulo.csharp.lang.psi.impl.source; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import consulo.annotations.RequiredReadAction; import consulo.csharp.ide.refactoring.CSharpRefactoringUtil; import consulo.csharp.lang.psi.CSharpStubElements; import consulo.csharp.lang.psi.impl.stub.MemberStub; import consulo.dotnet.psi.DotNetModifier; import consulo.dotnet.psi.DotNetModifierList; import consulo.dotnet.psi.DotNetModifierListOwner; import consulo.dotnet.psi.DotNetQualifiedElement; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.ContributedReferenceHost; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReferenceService; import com.intellij.psi.stubs.IStubElementType; import com.intellij.util.IncorrectOperationException; /** * @author VISTALL * @since 15.12.13. */ public abstract class CSharpStubMemberImpl<S extends MemberStub<?>> extends CSharpStubElementImpl<S> implements PsiNameIdentifierOwner, DotNetModifierListOwner, DotNetQualifiedElement, ContributedReferenceHost { public CSharpStubMemberImpl(@NotNull ASTNode node) { super(node); } public CSharpStubMemberImpl(@NotNull S stub, @NotNull IStubElementType<? extends S, ?> nodeType) { super(stub, nodeType); } @NotNull @Override public PsiReference[] getReferences() { return PsiReferenceService.getService().getContributedReferences(this); } @RequiredReadAction @Override @Nullable public DotNetModifierList getModifierList() { return getStubOrPsiChild(CSharpStubElements.MODIFIER_LIST); } @Override @RequiredReadAction public boolean hasModifier(@NotNull DotNetModifier modifier) { DotNetModifierList modifierList = getModifierList(); return modifierList != null && modifierList.hasModifier(modifier); } @RequiredReadAction public void addModifier(@NotNull DotNetModifier modifier) { DotNetModifierList modifierList = getModifierList(); if(modifierList != null) { modifierList.addModifier(modifier); } } @Override @Nullable @RequiredReadAction public PsiElement getNameIdentifier() { return getStubOrPsiChild(CSharpStubElements.IDENTIFIER); } @RequiredReadAction @Nullable @Override public String getPresentableQName() { String parentQName = getPresentableParentQName(); if(StringUtil.isEmpty(parentQName)) { return getName(); } return parentQName + "." + getName(); } @RequiredReadAction @Nullable @Override public String getPresentableParentQName() { S stub = getStub(); if(stub != null) { return stub.getParentQName(); } PsiElement parent = getParent(); if(parent instanceof DotNetQualifiedElement) { return ((DotNetQualifiedElement) parent).getPresentableQName(); } return ""; } @RequiredReadAction @Override public int getTextOffset() { PsiElement nameIdentifier = getNameIdentifier(); return nameIdentifier != null ? nameIdentifier.getTextOffset() : super.getTextOffset(); } @Override @RequiredReadAction public String getName() { return CSharpPsiUtilImpl.getNameWithoutAt(this); } @Override public PsiElement setName(@NonNls @NotNull String s) throws IncorrectOperationException { CSharpRefactoringUtil.replaceNameIdentifier(this, s); return this; } }