/*
* Copyright 2013-2016 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.unity3d.shaderlab.ide.highlight;
import org.jetbrains.annotations.NotNull;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
import com.intellij.codeInsight.daemon.impl.HighlightVisitor;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import consulo.annotations.RequiredReadAction;
import consulo.unity3d.shaderlab.lang.ShaderLabPropertyType;
import consulo.unity3d.shaderlab.lang.psi.ShaderLabFile;
import consulo.unity3d.shaderlab.lang.psi.ShaderLabKeyTokens;
import consulo.unity3d.shaderlab.lang.psi.ShaderPropertyElement;
import consulo.unity3d.shaderlab.lang.psi.ShaderPropertyTypeElement;
import consulo.unity3d.shaderlab.lang.psi.ShaderReference;
import consulo.unity3d.shaderlab.lang.psi.SharpLabElementVisitor;
/**
* @author VISTALL
* @since 08.05.2015
*/
public class SharpLabHighlightVisitor extends SharpLabElementVisitor implements HighlightVisitor
{
private HighlightInfoHolder myHolder;
@Override
public void visitProperty(ShaderPropertyElement p)
{
super.visitProperty(p);
PsiElement nameIdentifier = p.getNameIdentifier();
if(nameIdentifier != null)
{
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.INFORMATION).range(nameIdentifier).textAttributes(DefaultLanguageHighlighterColors.INSTANCE_FIELD).create());
}
}
@Override
public void visitPropertyType(ShaderPropertyTypeElement type)
{
super.visitPropertyType(type);
PsiElement element = type.getTargetElement();
ShaderLabPropertyType shaderLabPropertyType = ShaderLabPropertyType.find(element.getText());
if(shaderLabPropertyType == null)
{
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(element).descriptionAndTooltip("Wrong type").create());
}
else
{
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.INFORMATION).range(element).textAttributes(DefaultLanguageHighlighterColors.TYPE_ALIAS_NAME).create());
}
}
@Override
@RequiredReadAction
public void visitReference(ShaderReference reference)
{
if(!reference.isSoft())
{
PsiElement resolve = reference.resolve();
if(resolve == null)
{
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.WRONG_REF).range(reference.getReferenceElement()).descriptionAndTooltip("'" + reference.getReferenceName() + "' is not " +
"resolved").create());
}
else
{
ShaderReference.ResolveKind kind = reference.kind();
TextAttributesKey key = null;
switch(kind)
{
case ATTRIBUTE:
key = DefaultLanguageHighlighterColors.METADATA;
break;
case PROPERTY:
key = DefaultLanguageHighlighterColors.INSTANCE_FIELD;
break;
default:
return;
}
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.INFORMATION).range(reference.getReferenceElement()).textAttributes(key).create());
}
}
}
@Override
public void visitElement(PsiElement element)
{
super.visitElement(element);
ASTNode node = element.getNode();
if(node != null)
{
if(node.getElementType() == ShaderLabKeyTokens.VALUE_KEYWORD)
{
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.INFORMATION).range(node).textAttributes(DefaultLanguageHighlighterColors.MACRO_KEYWORD).create());
}
else if(node.getElementType() == ShaderLabKeyTokens.START_KEYWORD)
{
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.INFORMATION).range(node).textAttributes(DefaultLanguageHighlighterColors.KEYWORD).create());
}
}
}
@Override
public boolean suitableForFile(@NotNull PsiFile file)
{
return file instanceof ShaderLabFile;
}
@Override
public void visit(@NotNull PsiElement element)
{
element.accept(this);
}
@Override
public boolean analyze(@NotNull PsiFile file, boolean updateWholeFile, @NotNull HighlightInfoHolder holder, @NotNull Runnable action)
{
myHolder = holder;
action.run();
return true;
}
@NotNull
@Override
public HighlightVisitor clone()
{
return new SharpLabHighlightVisitor();
}
@Override
public int order()
{
return 0;
}
}