1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2 file Copyright.txt or https://cmake.org/licensing for details. */ 3 #pragma once 4 5 #include "cmConfigure.h" // IWYU pragma: keep 6 7 #include <memory> 8 #include <string> 9 #include <vector> 10 11 /** \class cmDependsJavaParserHelper 12 * \brief Helper class for parsing java source files 13 * 14 * Finds dependencies for java file and list of outputs 15 */ 16 class cmDependsJavaParserHelper 17 { 18 public: 19 struct ParserType 20 { 21 char* str; 22 }; 23 24 cmDependsJavaParserHelper(); 25 ~cmDependsJavaParserHelper(); 26 27 cmDependsJavaParserHelper(const cmDependsJavaParserHelper&) = delete; 28 cmDependsJavaParserHelper& operator=(const cmDependsJavaParserHelper&) = 29 delete; 30 31 int ParseString(const char* str, int verb); 32 int ParseFile(const char* file); 33 34 // For the lexer: 35 void AllocateParserType(cmDependsJavaParserHelper::ParserType* pt, 36 const char* str, int len = 0); 37 38 int LexInput(char* buf, int maxlen); 39 void Error(const char* str); 40 41 // For yacc 42 void AddClassFound(const char* sclass); 43 void PrepareElement(ParserType* me); 44 void DeallocateParserType(char** pt); 45 void CheckEmpty(int line, int cnt, ParserType* pt); 46 void StartClass(const char* cls); 47 void EndClass(); 48 void AddPackagesImport(const char* sclass); SetCurrentPackage(const char * pkg)49 void SetCurrentPackage(const char* pkg) { this->CurrentPackage = pkg; } GetCurrentPackage()50 const char* GetCurrentPackage() { return this->CurrentPackage.c_str(); } SetCurrentCombine(const char * cmb)51 void SetCurrentCombine(const char* cmb) { this->CurrentCombine = cmb; } GetCurrentCombine()52 const char* GetCurrentCombine() { return this->CurrentCombine.c_str(); } 53 void UpdateCombine(const char* str1, const char* str2); 54 GetClassesFound()55 std::vector<std::string>& GetClassesFound() { return this->ClassesFound; } 56 57 std::vector<std::string> GetFilesProduced(); 58 59 private: 60 class CurrentClass 61 { 62 public: 63 std::string Name; 64 std::vector<CurrentClass> NestedClasses; 65 void AddFileNamesForPrinting(std::vector<std::string>* files, 66 const char* prefix, const char* sep) const; 67 }; 68 std::string CurrentPackage; 69 std::string::size_type InputBufferPos; 70 std::string InputBuffer; 71 std::vector<char> OutputBuffer; 72 std::vector<std::string> ClassesFound; 73 std::vector<std::string> PackagesImport; 74 std::string CurrentCombine; 75 76 std::vector<CurrentClass> ClassStack; 77 78 int CurrentLine; 79 int UnionsAvailable; 80 int LastClassId; 81 int CurrentDepth; 82 int Verbose; 83 84 std::vector<std::unique_ptr<char[]>> Allocates; 85 86 void PrintClasses(); 87 88 void Print(const char* place, const char* str) const; 89 void CombineUnions(char** out, const char* in1, char** in2, const char* sep); 90 void SafePrintMissing(const char* str, int line, int cnt); 91 92 void CleanupParser(); 93 }; 94 95 #define YYSTYPE cmDependsJavaParserHelper::ParserType 96 #define YYSTYPE_IS_DECLARED 97 #define YY_EXTRA_TYPE cmDependsJavaParserHelper* 98 #define YY_DECL int cmDependsJava_yylex(YYSTYPE* yylvalp, yyscan_t yyscanner) 99