private CXChildVisitResult ContextVisitor(CXCursor cursor, CXCursor parent, IntPtr data) { // prepare context handle GCHandle contextHandle = (GCHandle)data; List <string> context = contextHandle.Target as List <string>; if (ClangTraits.IsNonTypeTemplateParamLiteral(cursor)) { List <string> tokens = ASTVisitor.GetCursorTokens(cursor); string literal = string.Concat(tokens); context.Add(literal); } else if (ClangTraits.IsTemplateRef(cursor)) { CXCursor refCursor = clang.getCursorReferenced(cursor); if (ClangTraits.IsTemplateAlias(refCursor)) { //clang.visitChildren(refCursor, ContextVisitor, new CXClientData(data)); clang.visitChildren(refCursor, (CXCursor c, CXCursor p, IntPtr d) => { if (CXCursorKind.CXCursor_TypeAliasDecl == c.kind) { return(CXChildVisitResult.CXChildVisit_Recurse); } ContextVisitor(c, p, d); return(CXChildVisitResult.CXChildVisit_Continue); }, new CXClientData(data)); } } return(CXChildVisitResult.CXChildVisit_Continue); }
private TemplateParameter GetTemplateNonTypeParameter(AST ast, TemplateProto tp, CXCursor cursor) { string paramName = clang.getCursorSpelling(cursor).ToString(); bool isVariadic = ClangTraits.IsVariadicTemplateParameter(cursor); // check if dependent or nontype bool isDependent = false; string dependName = null; string default_value = null; clang.visitChildren(cursor, (CXCursor c, CXCursor p, IntPtr data) => { if (ClangTraits.IsTypeRef(c)) { CXType t = clang.getCursorType(c); if (ClangTraits.IsUnexposedType(t)) { isDependent = true; dependName = clang.getCursorSpelling(c).ToString(); } } else if (ClangTraits.IsNonTypeTemplateParamLiteral(c)) { List <string> tokens = ASTVisitor.GetCursorTokens(c); default_value = string.Concat(tokens); } return(CXChildVisitResult.CXChildVisit_Continue); }, new CXClientData(IntPtr.Zero)); TemplateParameter param; if (isDependent) { Debug.Assert(dependName != null); param = new TemplateParameter(paramName, TemplateParameterKind.Dependent, isVariadic); TemplateParameter dependeParam = tp.GetTemplateParameter(dependName); Debug.Assert(dependeParam != null); param.SetExtra(dependeParam, default_value); } else { CXType type = clang.getCursorType(cursor); NativeType nativeType = TypeVisitorHelper.GetNativeType(AST_, type); param = new TemplateParameter(paramName, TemplateParameterKind.NoneType, isVariadic); param.SetExtra(nativeType, default_value); } return(param); }