private static IDeclaredElement FindDeclaredElement(IPsiView psiView, out IDeclaration declarationUnderCaret) { declarationUnderCaret = null; var referenceName = psiView.GetSelectedTreeNode <IReferenceName>(); if (referenceName != null) { return(referenceName.Reference.Resolve().DeclaredElement); } var identifier = psiView.GetSelectedTreeNode <IShaderLabIdentifier>(); declarationUnderCaret = PropertyDeclarationNavigator.GetByName(identifier); return(declarationUnderCaret?.DeclaredElement); }
public IColorReference GetColorReference(ITreeNode element) { if (element is IVectorLiteral vectorLiteral) { var vectorPropertyValue = VectorPropertyValueNavigator.GetByVector(vectorLiteral); if (vectorPropertyValue != null) { // Does the vector literal belong to a vector property or a color property? var propertyDeclation = PropertyDeclarationNavigator.GetByPropertValue(vectorPropertyValue); if (propertyDeclation == null) { return(null); } if (!(propertyDeclation.PropertyType is ISimplePropertyType simplePropertyType) || simplePropertyType.Keyword?.NodeType != ShaderLabTokenType.COLOR_KEYWORD) { return(null); } } var values = vectorLiteral.Numbers; if (values.Count == 3 || values.Count == 4) { var r = GetColorValue(values[0]); var g = GetColorValue(values[1]); var b = GetColorValue(values[2]); // Technically, the colour should have 4 values, but show the highlight even if we're unfinished var a = values.Count == 4 ? GetColorValue(values[3]) : 255; var colorElement = new ColorElement(Color.FromArgb(a, r, g, b)); var range = GetDocumentRange(values[0], values.Last()); return(new ShaderLabColorReference(colorElement, VectorPropertyValueNavigator.GetByVector(vectorLiteral), ColorValueNavigator.GetByConstant(vectorLiteral), range)); } } return(null); }
private static IDeclaredElement FindDeclaredElement([NotNull] IPsiView psiView) { var referenceExpression = psiView.GetSelectedTreeNode <IReferenceExpression>(); if (referenceExpression != null) { return(referenceExpression.Reference.Resolve().DeclaredElement); } var identifier = psiView.GetSelectedTreeNode <ICSharpIdentifier>(); if (identifier != null) { var referenceName = ReferenceNameNavigator.GetByNameIdentifier(identifier); if (referenceName != null) { return(referenceName.Reference.Resolve().DeclaredElement); } var declarationUnderCaret = FieldDeclarationNavigator.GetByNameIdentifier(identifier) ?? PropertyDeclarationNavigator.GetByNameIdentifier(identifier) ?? MethodDeclarationNavigator.GetByNameIdentifier(identifier) ?? ConstructorDeclarationNavigator.GetByTypeName(identifier) ?? CSharpTypeDeclarationNavigator.GetByNameIdentifier(identifier) ?? EventDeclarationNavigator.GetByNameIdentifier(identifier) ?? ConstantDeclarationNavigator.GetByNameIdentifier(identifier) ?? VariableDeclarationNavigator.GetByNameIdentifier(identifier); return(declarationUnderCaret?.DeclaredElement); } var predefinedTypeUsage = psiView.GetSelectedTreeNode <IPredefinedTypeUsage>(); return(predefinedTypeUsage?.ScalarPredefinedTypeName.Reference.Resolve().DeclaredElement); }