/* Handle syntax checking request, message format: source_length: [#src_length#] <# SOURCE CODE #> */ void completion_doSyntaxCheck(completion_Session *session, FILE *fp) { unsigned int i_diag = 0, n_diag; CXDiagnostic diag; CXString dmsg; /* get a copy of fresh source file */ completion_readSourcefile(session, fp); /* reparse the source to retrieve diagnostic message */ completion_reparseTranslationUnit(session); /* dump all diagnostic messages to fp */ n_diag = clang_getNumDiagnostics(session->cx_tu); for ( ; i_diag < n_diag; i_diag++) { diag = clang_getDiagnostic(session->cx_tu, i_diag); dmsg = clang_formatDiagnostic(diag, clang_defaultDiagnosticDisplayOptions()); fprintf(stdout, "%s\n", clang_getCString(dmsg)); clang_disposeString(dmsg); clang_disposeDiagnostic(diag); } fprintf(stdout, "$"); fflush(stdout); /* end of output */ }
/* Update command line arguments passing to clang translation unit. Format of the coming CMDLINEARGS message is as follows: num_args: [#n_args#] arg1 arg2 ... (there should be n_args items here) */ void completion_doCmdlineArgs(completion_Session *session, FILE *fp) { int i_arg = 0; char arg[LINE_MAX]; /* destroy command line args, and we will rebuild it later */ completion_freeCmdlineArgs(session); /* get number of arguments */ fscanf(fp, "num_args:%d", &(session->num_args)); __skip_the_rest(fp); session->cmdline_args = (char**)calloc(sizeof(char*), session->num_args); /* rebuild command line arguments vector according to the message */ for ( ; i_arg < session->num_args; i_arg++) { /* fetch an argument from message */ fscanf(fp, "%s", arg); /* and add it to cmdline_args */ session->cmdline_args[i_arg] = (char*)calloc(sizeof(char), strlen(arg) + 1); strcpy(session->cmdline_args[i_arg], arg); } /* we have to rebuild our translation units to make these cmdline args changes take place */ clang_disposeTranslationUnit(session->cx_tu); completion_parseTranslationUnit(session); completion_reparseTranslationUnit(session); /* dump PCH for acceleration */ }
/* Initialize session object and launch the completion server, preparse the source file and build the AST for furture code completion requests */ void startup_completionSession(int argc, char *argv[], completion_Session *session) { __initialize_completionSession(argc, argv, session); /* default parameters */ session->ParseOptions = DEFAULT_PARSE_OPTIONS; session->CompleteAtOptions = DEFAULT_COMPLETEAT_OPTIONS; session->cx_index = clang_createIndex(0, 0); completion_parseTranslationUnit(session); completion_reparseTranslationUnit(session); }
/* Reparse the source code to refresh the translation unit */ void completion_doReparse(completion_Session *session, FILE *fp) { (void) fp; /* get rid of unused parameter warning */ completion_reparseTranslationUnit(session); }