/* * Copyright 2010 Jean-Paul Balabanian and Yngve Devik Hammersland * * This file is part of glsl4idea. * * Glsl4idea is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * Glsl4idea is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glsl4idea. If not, see <http://www.gnu.org/licenses/>. */ package glslplugin.lang.elements.declarations; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import glslplugin.lang.elements.GLSLElementImpl; import glslplugin.lang.elements.GLSLTokenTypes; import glslplugin.lang.elements.types.GLSLTypeQualifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.logging.Logger; /** * GLSLQualifier is all kinds of qualifiers combined into a single class. * <p/> * The qualifiers are associated with a qualifier type which are ordered by an integer value. * Qualifiers needs to appear in increasing order. Some storage qualifiers may be combined, * <code>varying centroid</code> in particular. * * @author Yngve Devik Hammersland * Date: Feb 2, 2009 * Time: 9:34:12 AM */ public class GLSLQualifier extends GLSLElementImpl { @SuppressWarnings("unused") //It is used, as .values() public enum Qualifier { // Storage Qualifiers CONST(GLSLTypeQualifier.STORAGE_QUALIFIER, "const", GLSLTokenTypes.CONST_KEYWORD), ATTRIBUTE(GLSLTypeQualifier.STORAGE_QUALIFIER, "attribute", GLSLTokenTypes.ATTRIBUTE_KEYWORD), UNIFORM(GLSLTypeQualifier.STORAGE_QUALIFIER, "uniform", GLSLTokenTypes.UNIFORM_KEYWORD), VARYING(GLSLTypeQualifier.STORAGE_QUALIFIER, "varying", GLSLTokenTypes.VARYING_KEYWORD), CENTROID(GLSLTypeQualifier.STORAGE_QUALIFIER, "centroid", GLSLTokenTypes.CENTROID_KEYWORD), PATCH(GLSLTypeQualifier.STORAGE_QUALIFIER, "patch", GLSLTokenTypes.PATCH_KEYWORD), SAMPLE(GLSLTypeQualifier.STORAGE_QUALIFIER, "sample", GLSLTokenTypes.SAMPLE_KEYWORD), BUFFER(GLSLTypeQualifier.STORAGE_QUALIFIER, "buffer", GLSLTokenTypes.BUFFER_KEYWORD), SHARED(GLSLTypeQualifier.STORAGE_QUALIFIER, "shared", GLSLTokenTypes.SHARED_KEYWORD), // Memory Qualifiers COHERENT(GLSLTypeQualifier.MEMORY_QUALIFIER,"coherent",GLSLTokenTypes.COHERENT_KEYWORD), VOLATILE(GLSLTypeQualifier.MEMORY_QUALIFIER,"volatile",GLSLTokenTypes.VOLATILE_KEYWORD), RESTRICT(GLSLTypeQualifier.MEMORY_QUALIFIER,"restrict",GLSLTokenTypes.RESTRICT_KEYWORD), READONLY(GLSLTypeQualifier.MEMORY_QUALIFIER,"readonly",GLSLTokenTypes.READONLY_KEYWORD), WRITEONLY(GLSLTypeQualifier.MEMORY_QUALIFIER,"writeonly",GLSLTokenTypes.WRITEONLY_KEYWORD), // Invariant Qualifier INVARIANT(GLSLTypeQualifier.INVARIANT_QUALIFIER, "invariant", GLSLTokenTypes.INVARIANT_KEYWORD), // Subroutine Qualifier SUBROUTINE(GLSLTypeQualifier.SUBROUTINE_QUALIFIER, "subroutine", GLSLTokenTypes.SUBROUTINE_KEYWORD), // Precise Qualifier PRECISE(GLSLTypeQualifier.PRECISE_QUALIFIER, "precise", GLSLTokenTypes.PRECISE_KEYWORD), // ES Storage Qualifiers HIGHP(GLSLTypeQualifier.PRECISION_QUALIFIER, "highp", GLSLTokenTypes.HIGHP_KEYWORD), MEDIUMP(GLSLTypeQualifier.PRECISION_QUALIFIER, "mediump", GLSLTokenTypes.MEDIUMP_KEYWORD), LOWP(GLSLTypeQualifier.PRECISION_QUALIFIER, "lowp", GLSLTokenTypes.LOWP_KEYWORD), // Parameter Modifiers IN(GLSLTypeQualifier.PARAMETER_MODIFIER , "in", GLSLTokenTypes.IN_KEYWORD), OUT(GLSLTypeQualifier.PARAMETER_MODIFIER, "out", GLSLTokenTypes.OUT_KEYWORD), INOUT(GLSLTypeQualifier.PARAMETER_MODIFIER, "inout", GLSLTokenTypes.INOUT_KEYWORD), // Interpolation modifiers SMOOTH(GLSLTypeQualifier.INTERPOLATION_MODIFIER, "smooth", GLSLTokenTypes.SMOOTH_KEYWORD), FLAT(GLSLTypeQualifier.INTERPOLATION_MODIFIER, "flat", GLSLTokenTypes.FLAT_KEYWORD), NOPERSPECTIVE(GLSLTypeQualifier.INTERPOLATION_MODIFIER, "noperspective", GLSLTokenTypes.NOPERSPECTIVE_KEYWORD), LAYOUT(GLSLTypeQualifier.LAYOUT_QUALIFIER, "layout", GLSLTokenTypes.LAYOUT_KEYWORD), ; private final GLSLTypeQualifier type; private final String textRepresentation; private final IElementType correspondingElement; Qualifier(GLSLTypeQualifier type, String textRepresentation, IElementType correspondingElement) { this.type = type; this.textRepresentation = textRepresentation; this.correspondingElement = correspondingElement; } GLSLTypeQualifier getType() { return type; } IElementType getCorrespondingElement() { return correspondingElement; } @Override public String toString() { return textRepresentation; } } @Nullable public Qualifier getQualifier() { PsiElement qualifier = getFirstChild(); if(qualifier == null)return null; ASTNode qualifierNode = qualifier.getNode(); if(qualifierNode == null)return null; return getQualifierFromType(qualifierNode.getElementType()); } @Nullable public GLSLTypeQualifier getQualifierType() { Qualifier qualifier = getQualifier(); if(qualifier == null)return null; return qualifier.getType(); } @Nullable private Qualifier getQualifierFromType(IElementType elt) { for (Qualifier qualifier : Qualifier.values()) { if (qualifier.getCorrespondingElement() == elt) { return qualifier; } } Logger.getLogger("GLSLQualifier").warning("Unsupported element type: " + elt); return null; } public GLSLQualifier(@NotNull ASTNode astNode) { super(astNode); } @Override public String toString() { return "Qualifier: " + getQualifier(); } }