CodeCompletionKind FromClangKind(NClang.CursorKind kind) { switch (kind) { case NClang.CursorKind.FunctionDeclaration: case NClang.CursorKind.CXXMethod: case NClang.CursorKind.Constructor: case NClang.CursorKind.Destructor: case NClang.CursorKind.FunctionTemplate: case NClang.CursorKind.ClassTemplate: return CodeCompletionKind.Method; case NClang.CursorKind.ClassDeclaration: return CodeCompletionKind.Class; case NClang.CursorKind.StructDeclaration: return CodeCompletionKind.Struct; case NClang.CursorKind.MacroDefinition: return CodeCompletionKind.Macro; case NClang.CursorKind.NotImplemented: case NClang.CursorKind.TypedefDeclaration: return CodeCompletionKind.Keyword; case NClang.CursorKind.EnumDeclaration: return CodeCompletionKind.Enum; case NClang.CursorKind.EnumConstantDeclaration: return CodeCompletionKind.EnumConstant; case NClang.CursorKind.VarDeclaration: return CodeCompletionKind.Variable; case NClang.CursorKind.Namespace: return CodeCompletionKind.Namespace; case NClang.CursorKind.ParmDeclaration: return CodeCompletionKind.Field; case NClang.CursorKind.FieldDeclaration: return CodeCompletionKind.Parameter; } Console.WriteLine($"dont understand{kind.ToString()}"); return CodeCompletionKind.None; }
private void ScanTokens(NClang.ClangTranslationUnit tu, SyntaxHighlightDataList result) { var tokens = tu.Tokenize(tu.GetCursor().CursorExtent); //var annotatedTokens = tokens.Annotate(); //TODO see if this can provide us with additional data. foreach (var token in tokens.Tokens) { var highlightData = new OffsetSyntaxHighlightingData(); highlightData.Start = token.Extent.Start.FileLocation.Offset; highlightData.Length = token.Extent.End.FileLocation.Offset - highlightData.Start; switch (token.Kind) { case TokenKind.Comment: highlightData.Type = HighlightType.Comment; result.Add(highlightData); break; case TokenKind.Keyword: highlightData.Type = HighlightType.Keyword; result.Add(highlightData); break; } } }
private OffsetSyntaxHighlightingData CreateOffsetData(NClang.ClangCursor cursor, NClang.ClangCursor parent) { HighlightType highlightKind = HighlightType.Literal; bool useSpellingLocation = false; switch (cursor.Kind) { case NClang.CursorKind.StringLiteral: case NClang.CursorKind.CharacterLiteral: break; case NClang.CursorKind.IntegerLiteral: case NClang.CursorKind.FloatingLiteral: case NClang.CursorKind.ImaginaryLiteral: highlightKind = HighlightType.NumericLiteral; break; case NClang.CursorKind.Constructor: case NClang.CursorKind.Destructor: case NClang.CursorKind.TypedefDeclaration: case NClang.CursorKind.ClassDeclaration: case NClang.CursorKind.TemplateReference: useSpellingLocation = true; highlightKind = HighlightType.ClassName; break; case NClang.CursorKind.EnumDeclaration: case NClang.CursorKind.UnionDeclaration: useSpellingLocation = true; highlightKind = HighlightType.EnumTypeName; break; case NClang.CursorKind.TemplateTypeParameter: useSpellingLocation = true; highlightKind = HighlightType.InterfaceName; break; case NClang.CursorKind.TypeReference: if (parent.Kind == NClang.CursorKind.CXXBaseSpecifier) { highlightKind = HighlightType.ClassName; useSpellingLocation = true; } else if (cursor.CursorType.Kind == NClang.TypeKind.Enum) { highlightKind = HighlightType.EnumTypeName; } else if (cursor.CursorType.Kind == NClang.TypeKind.Record && cursor.Spelling.StartsWith("union")) { highlightKind = HighlightType.EnumTypeName; } else { highlightKind = HighlightType.ClassName; } break; case NClang.CursorKind.CXXMethod: case NClang.CursorKind.FunctionDeclaration: useSpellingLocation = true; highlightKind = HighlightType.CallExpression; break; case NClang.CursorKind.FirstExpression: if (parent.Kind == NClang.CursorKind.CallExpression && cursor.CursorType.Kind == NClang.TypeKind.Pointer && cursor.CursorType.PointeeType.Kind == NClang.TypeKind.FunctionProto) { useSpellingLocation = true; highlightKind = HighlightType.CallExpression; } else { return null; } break; case NClang.CursorKind.MemberReferenceExpression: if (parent.Kind == NClang.CursorKind.CallExpression && cursor.CursorType.Kind == NClang.TypeKind.Pointer && cursor.CursorType.PointeeType.Kind == NClang.TypeKind.FunctionProto) { useSpellingLocation = true; highlightKind = HighlightType.CallExpression; } else if (parent.Kind == NClang.CursorKind.CallExpression && cursor.CursorType.Kind == NClang.TypeKind.Unexposed) { useSpellingLocation = true; highlightKind = HighlightType.CallExpression; } else { return null; } break; default: return null; } if (highlightKind == HighlightType.ClassName) { string spelling = cursor.Spelling; if (cursor.Kind == NClang.CursorKind.TypeReference && parent.Kind == NClang.CursorKind.CXXBaseSpecifier) { spelling = cursor.Spelling.Replace("class ", string.Empty); } if (spelling.Length > 1 && spelling.StartsWith("I") && char.IsUpper(spelling[1])) { highlightKind = HighlightType.InterfaceName; } } if (useSpellingLocation) { if (cursor.Kind == NClang.CursorKind.TypeReference && parent.Kind == NClang.CursorKind.CXXBaseSpecifier && cursor.Spelling.StartsWith("class")) { return new OffsetSyntaxHighlightingData() { Start = cursor.Location.SpellingLocation.Offset, Length = cursor.Spelling.Length - 5, // Because spelling includes keyword "class" Type = highlightKind }; } else if ((cursor.Kind == NClang.CursorKind.Destructor || cursor.Kind == NClang.CursorKind.Constructor) && parent.Kind == NClang.CursorKind.ClassTemplate) { return new OffsetSyntaxHighlightingData() { Start = cursor.Location.SpellingLocation.Offset, Length = cursor.Spelling.Length, // TODO select only the name... Type = highlightKind }; } else { return new OffsetSyntaxHighlightingData() { Start = cursor.Location.SpellingLocation.Offset, Length = cursor.Spelling.Length, Type = highlightKind }; } } else { return new OffsetSyntaxHighlightingData() { Start = cursor.CursorExtent.Start.FileLocation.Offset, Length = cursor.CursorExtent.End.FileLocation.Offset - cursor.CursorExtent.Start.FileLocation.Offset, Type = highlightKind }; } }