diff --git a/.gitignore b/.gitignore index b3a52364a..23c10153f 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,7 @@ nbproject/ ## Build folders build/ build_*/ +Build/ +Build_*/ install/ install_*/ diff --git a/plugins/csharp/csharp.sln b/plugins/csharp/csharp.sln new file mode 100644 index 000000000..ff51f7e00 --- /dev/null +++ b/plugins/csharp/csharp.sln @@ -0,0 +1,69 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "db_model", "db_model", "{2E2F0E00-502D-A052-0019-82CFB9270E3D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "migrations", "migrations", "{D4C4D1C2-DE9C-AF20-17FD-0A3EB2BFD436}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "service", "service", "{226567F5-DD15-7888-5BF1-C4407778305A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "parser", "parser", "{BC34E35A-B109-A120-90EC-15530B70B9CB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbModel", "db_model\DbModel.csproj", "{BADE2559-4F0F-21F6-067B-8EDF7DE9DFC1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqliteMigrations", "migrations\sqliteMigrations\SqliteMigrations.csproj", "{2C9A9B86-A50E-C025-B4E0-195D2ACD4B54}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PgsqlMigrations", "migrations\pgsqlMigrations\PgsqlMigrations.csproj", "{20C587AF-64DB-68B4-1F92-61681232D74B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src_csharp", "src_csharp", "{9BD6E17B-7A65-7B8B-5096-A508D0BE5AAA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharpservice", "service\src_csharp\csharpservice.csproj", "{1AF03105-21A5-3508-A40F-365ADA9DFF92}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src_csharp", "src_csharp", "{37C60329-C8F7-3ACB-DE03-F714C9EE58C5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpParser", "parser\src_csharp\CSharpParser.csproj", "{568E5C5A-2A3E-AEA2-1355-EC26E382DA2B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BADE2559-4F0F-21F6-067B-8EDF7DE9DFC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BADE2559-4F0F-21F6-067B-8EDF7DE9DFC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BADE2559-4F0F-21F6-067B-8EDF7DE9DFC1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BADE2559-4F0F-21F6-067B-8EDF7DE9DFC1}.Release|Any CPU.Build.0 = Release|Any CPU + {2C9A9B86-A50E-C025-B4E0-195D2ACD4B54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2C9A9B86-A50E-C025-B4E0-195D2ACD4B54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C9A9B86-A50E-C025-B4E0-195D2ACD4B54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2C9A9B86-A50E-C025-B4E0-195D2ACD4B54}.Release|Any CPU.Build.0 = Release|Any CPU + {20C587AF-64DB-68B4-1F92-61681232D74B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20C587AF-64DB-68B4-1F92-61681232D74B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20C587AF-64DB-68B4-1F92-61681232D74B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20C587AF-64DB-68B4-1F92-61681232D74B}.Release|Any CPU.Build.0 = Release|Any CPU + {1AF03105-21A5-3508-A40F-365ADA9DFF92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1AF03105-21A5-3508-A40F-365ADA9DFF92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AF03105-21A5-3508-A40F-365ADA9DFF92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1AF03105-21A5-3508-A40F-365ADA9DFF92}.Release|Any CPU.Build.0 = Release|Any CPU + {568E5C5A-2A3E-AEA2-1355-EC26E382DA2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {568E5C5A-2A3E-AEA2-1355-EC26E382DA2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {568E5C5A-2A3E-AEA2-1355-EC26E382DA2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {568E5C5A-2A3E-AEA2-1355-EC26E382DA2B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {BADE2559-4F0F-21F6-067B-8EDF7DE9DFC1} = {2E2F0E00-502D-A052-0019-82CFB9270E3D} + {2C9A9B86-A50E-C025-B4E0-195D2ACD4B54} = {D4C4D1C2-DE9C-AF20-17FD-0A3EB2BFD436} + {20C587AF-64DB-68B4-1F92-61681232D74B} = {D4C4D1C2-DE9C-AF20-17FD-0A3EB2BFD436} + {9BD6E17B-7A65-7B8B-5096-A508D0BE5AAA} = {226567F5-DD15-7888-5BF1-C4407778305A} + {1AF03105-21A5-3508-A40F-365ADA9DFF92} = {9BD6E17B-7A65-7B8B-5096-A508D0BE5AAA} + {37C60329-C8F7-3ACB-DE03-F714C9EE58C5} = {BC34E35A-B109-A120-90EC-15530B70B9CB} + {568E5C5A-2A3E-AEA2-1355-EC26E382DA2B} = {37C60329-C8F7-3ACB-DE03-F714C9EE58C5} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {17FCE6F1-24FA-4D94-8799-D869033FFB44} + EndGlobalSection +EndGlobal diff --git a/plugins/csharp/parser/src/csharpparser.cpp b/plugins/csharp/parser/src/csharpparser.cpp index 490c82f56..e17e2c1a7 100644 --- a/plugins/csharp/parser/src/csharpparser.cpp +++ b/plugins/csharp/parser/src/csharpparser.cpp @@ -46,8 +46,6 @@ bool CsharpParser::parse() if (acceptProjectBuildPath(buildPath)) { - LOG(debug) << "C# parser parse path: " << paths[0]; - LOG(debug) << "Parsed csharp project build path: " << buildPath; success = success && parseProjectBuildPath(paths, buildPath); } else @@ -108,7 +106,6 @@ bool CsharpParser::parseProjectBuildPath( std::string line; std::stringstream log_str(log.get()); - //LOG(warning) << log_str.str(); int countFull = 0, countPart = 0; while(std::getline(log_str, line, '\n')) diff --git a/plugins/csharp/parser/src_csharp/AstVisitor.cs b/plugins/csharp/parser/src_csharp/AstVisitor.cs index 722804bf9..4c48de20a 100644 --- a/plugins/csharp/parser/src_csharp/AstVisitor.cs +++ b/plugins/csharp/parser/src_csharp/AstVisitor.cs @@ -14,6 +14,7 @@ partial class AstVisitor : CSharpSyntaxWalker private readonly CsharpDbContext DbContext; private readonly SemanticModel Model; private readonly SyntaxTree Tree; + private readonly AstVisitorHelper Helper; public bool FullyParsed = true; @@ -21,56 +22,10 @@ public AstVisitor(CsharpDbContext context, SemanticModel model, SyntaxTree tree) { this.DbContext = context; this.Model = model; - this.Tree = tree; - } - - private ulong createIdentifier(CsharpAstNode astNode){ - string[] properties = - { - astNode.AstValue,":", - astNode.AstType.ToString(),":", - astNode.EntityHash.ToString(),":", - astNode.RawKind.ToString(),":", - astNode.Path,":", - astNode.Location_range_start_line.ToString(),":", - astNode.Location_range_start_column.ToString(),":", - astNode.Location_range_end_line.ToString(),":", - astNode.Location_range_end_column.ToString() - }; - - string res = string.Concat(properties); - - //WriteLine(res); - return fnvHash(res); + this.Tree = tree; + this.Helper = new AstVisitorHelper(); } - private ulong fnvHash(string data_) - { - ulong hash = 14695981039346656037; - - int len = data_.Length; - for (int i = 0; i < len; ++i) - { - hash ^= data_[i]; - hash *= 1099511628211; - } - - return hash; - } - - private ulong getAstNodeId(SyntaxNode node){ - CsharpAstNode astNode = new CsharpAstNode - { - AstValue = node.ToString(), - RawKind = node.Kind(), - EntityHash = node.GetHashCode(), - AstType = AstTypeEnum.Declaration - }; - astNode.SetLocation(node.SyntaxTree.GetLineSpan(node.Span)); - var ret = createIdentifier(astNode); - return ret; - } - private CsharpAstNode AstNode(SyntaxNode node, AstSymbolTypeEnum type, AstTypeEnum astType) { Accessibility acc = Accessibility.NotApplicable; @@ -92,7 +47,7 @@ private CsharpAstNode AstNode(SyntaxNode node, AstSymbolTypeEnum type, AstTypeEn Accessibility = acc }; astNode.SetLocation(Tree.GetLineSpan(node.Span)); - astNode.Id = createIdentifier(astNode); + astNode.Id = Helper.createIdentifier(astNode); if (DbContext.CsharpAstNodes.Find(astNode.Id) == null) { @@ -933,7 +888,7 @@ public override void VisitInvocationExpression(InvocationExpressionSyntax node) FullyParsed = false; } var info = Model.GetTypeInfo(node).ConvertedType; - var declaratorNodeId = getAstNodeId(declaration.GetSyntax()); + var declaratorNodeId = Helper.getAstNodeId(declaration.GetSyntax()); var astNode = AstNode(node, AstSymbolTypeEnum.EtcEntity, AstTypeEnum.Usage); CsharpEtcEntity invoc = new CsharpEtcEntity { @@ -981,7 +936,7 @@ public override void VisitIdentifierName(IdentifierNameSyntax node) EtcEntityTypeEnum.ForeachExpr : EtcEntityTypeEnum.Invocation; if (node.Parent.Parent.Kind() != SyntaxKind.InvocationExpression) { - var declaratorNodeId = getAstNodeId(declaration.GetSyntax()); + var declaratorNodeId = Helper.getAstNodeId(declaration.GetSyntax()); var astNode = AstNode(node, AstSymbolTypeEnum.EtcEntity, AstTypeEnum.Usage); CsharpEtcEntity expr = new CsharpEtcEntity { diff --git a/plugins/csharp/parser/src_csharp/AstVisitorHelper.cs b/plugins/csharp/parser/src_csharp/AstVisitorHelper.cs new file mode 100644 index 000000000..0c2e17f33 --- /dev/null +++ b/plugins/csharp/parser/src_csharp/AstVisitorHelper.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using static System.Console; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using CSharpParser.model; +using Microsoft.CodeAnalysis; + +namespace CSharpParser +{ + class AstVisitorHelper + { + public ulong createIdentifier(CsharpAstNode astNode){ + string[] properties = + { + astNode.AstValue,":", + astNode.AstType.ToString(),":", + astNode.EntityHash.ToString(),":", + astNode.RawKind.ToString(),":", + astNode.Path,":", + astNode.Location_range_start_line.ToString(),":", + astNode.Location_range_start_column.ToString(),":", + astNode.Location_range_end_line.ToString(),":", + astNode.Location_range_end_column.ToString() + }; + + string res = string.Concat(properties); + + //WriteLine(res); + return fnvHash(res); + } + + private ulong fnvHash(string data_) + { + ulong hash = 14695981039346656037; + + int len = data_.Length; + for (int i = 0; i < len; ++i) + { + hash ^= data_[i]; + hash *= 1099511628211; + } + + return hash; + } + + public ulong getAstNodeId(SyntaxNode node){ + CsharpAstNode astNode = new CsharpAstNode + { + AstValue = node.ToString(), + RawKind = node.Kind(), + EntityHash = node.GetHashCode(), + AstType = AstTypeEnum.Declaration + }; + astNode.SetLocation(node.SyntaxTree.GetLineSpan(node.Span)); + var ret = createIdentifier(astNode); + return ret; + } + } +} \ No newline at end of file diff --git a/plugins/csharp/parser/src_csharp/Program.cs b/plugins/csharp/parser/src_csharp/Program.cs index a9b2b23a5..0c47ac800 100644 --- a/plugins/csharp/parser/src_csharp/Program.cs +++ b/plugins/csharp/parser/src_csharp/Program.cs @@ -82,7 +82,7 @@ static int Main(string[] args) }*/ //Converting the connectionstring into entiy framwork style connectionstring - string csharpConnectionString = transformConnectionString(); + string csharpConnectionString = ProgramHelper.transformConnectionString(_connectionString); var options = new DbContextOptionsBuilder() .UseNpgsql(csharpConnectionString) @@ -95,17 +95,17 @@ static int Main(string[] args) foreach (var p in _rootDir) { Console.WriteLine(p); - allFiles.AddRange(GetSourceFilesFromDir(p, ".cs")); + allFiles.AddRange(ProgramHelper.GetSourceFilesFromDir(p, ".cs")); } foreach (var f in allFiles) { WriteLine(f); } - IEnumerable assemblies = GetSourceFilesFromDir(_buildDir, ".dll"); + IEnumerable assemblies = ProgramHelper.GetSourceFilesFromDir(_buildDir, ".dll"); IEnumerable assemblies_base = assemblies; if (args.Length == 5) - assemblies_base = GetSourceFilesFromDir(_buildDirBase, ".dll"); + assemblies_base = ProgramHelper.GetSourceFilesFromDir(_buildDirBase, ".dll"); List trees = new List(); foreach (string file in allFiles) @@ -195,96 +195,6 @@ private static async Task ParseTree(CsharpDbContext context, return index; }); return await ParsingTask; - } - - public static IEnumerable GetSourceFilesFromDir(string root, string extension) - { - IEnumerable allFiles = new string[]{}; - // Data structure to hold names of subfolders. - ArrayList dirs = new ArrayList(); - - if (!System.IO.Directory.Exists(root)) - { - throw new ArgumentException(); - } - dirs.Add(root); - - while (dirs.Count > 0) - { - string currentDir = dirs[0].ToString(); - dirs.RemoveAt(0); - string[] subDirs; - try - { - subDirs = System.IO.Directory.GetDirectories(currentDir); - } - catch (UnauthorizedAccessException e) - { - WriteLine(e.Message); - continue; - } - catch (System.IO.DirectoryNotFoundException e) - { - WriteLine(e.Message); - continue; - } - - // Add the subdirectories for traversal. - dirs.AddRange(subDirs); - - string[] files = null; - try - { - files = System.IO.Directory.GetFiles(currentDir); - } - catch (UnauthorizedAccessException e) - { - Console.WriteLine(e.Message); - continue; - } - catch (System.IO.DirectoryNotFoundException e) - { - Console.WriteLine(e.Message); - continue; - } - - foreach (string file in files) - { - try - { - System.IO.FileInfo fi = new System.IO.FileInfo(file); - if (fi.Extension == extension) { - allFiles = allFiles.Append(file); - } - } - catch (System.IO.FileNotFoundException e) - { - // If file was deleted by a separate application - Console.WriteLine(e.Message); - } - } - } - - return allFiles; - } - - private static string transformConnectionString() - { - _connectionString = _connectionString.Substring(_connectionString.IndexOf(':')+1); - _connectionString = _connectionString.Replace("user", "username"); - string [] properties = _connectionString.Split(';'); - string csharpConnectionString = ""; - for (int i = 0; i < properties.Length; ++i) - { - csharpConnectionString += properties[i].Substring(0,1).ToUpper() - + properties[i].Substring(1); - if (i < properties.Length-1) - { - csharpConnectionString += ";"; - } - } - - return csharpConnectionString; - } + } } } diff --git a/plugins/csharp/parser/src_csharp/ProgramHelper.cs b/plugins/csharp/parser/src_csharp/ProgramHelper.cs new file mode 100644 index 000000000..fdcd9c1b7 --- /dev/null +++ b/plugins/csharp/parser/src_csharp/ProgramHelper.cs @@ -0,0 +1,107 @@ +using static System.Console; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.EntityFrameworkCore; +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Threading.Tasks; +using CSharpParser.model; + +namespace CSharpParser +{ + class ProgramHelper + { + public static IEnumerable GetSourceFilesFromDir(string root, string extension) + { + IEnumerable allFiles = new string[]{}; + // Data structure to hold names of subfolders. + ArrayList dirs = new ArrayList(); + + if (!System.IO.Directory.Exists(root)) + { + throw new ArgumentException(); + } + dirs.Add(root); + + while (dirs.Count > 0) + { + string currentDir = dirs[0].ToString(); + dirs.RemoveAt(0); + string[] subDirs; + try + { + subDirs = System.IO.Directory.GetDirectories(currentDir); + } + catch (UnauthorizedAccessException e) + { + WriteLine(e.Message); + continue; + } + catch (System.IO.DirectoryNotFoundException e) + { + WriteLine(e.Message); + continue; + } + + // Add the subdirectories for traversal. + dirs.AddRange(subDirs); + + string[] files = null; + try + { + files = System.IO.Directory.GetFiles(currentDir); + } + catch (UnauthorizedAccessException e) + { + Console.WriteLine(e.Message); + continue; + } + catch (System.IO.DirectoryNotFoundException e) + { + Console.WriteLine(e.Message); + continue; + } + + foreach (string file in files) + { + try + { + System.IO.FileInfo fi = new System.IO.FileInfo(file); + if (fi.Extension == extension) { + allFiles = allFiles.Append(file); + } + } + catch (System.IO.FileNotFoundException e) + { + // If file was deleted by a separate application + Console.WriteLine(e.Message); + } + } + } + + return allFiles; + } + + public static string transformConnectionString(string _connectionString) + { + _connectionString = _connectionString.Substring(_connectionString.IndexOf(':')+1); + _connectionString = _connectionString.Replace("user", "username"); + string [] properties = _connectionString.Split(';'); + string csharpConnectionString = ""; + for (int i = 0; i < properties.Length; ++i) + { + csharpConnectionString += properties[i].Substring(0,1).ToUpper() + + properties[i].Substring(1); + if (i < properties.Length-1) + { + csharpConnectionString += ";"; + } + } + + return csharpConnectionString; + } + } +} \ No newline at end of file diff --git a/plugins/csharp/service/include/service/csharpservice.h b/plugins/csharp/service/include/service/csharpservice.h index 3660098c9..81155a269 100644 --- a/plugins/csharp/service/include/service/csharpservice.h +++ b/plugins/csharp/service/include/service/csharpservice.h @@ -81,7 +81,7 @@ class CSharpQueryHandler : public CsharpServiceIf if (elapsed_time > timeoutInMs_) { - LOG(debug) << "Connection timeout, could not reach CSharp server on" + LOG(error) << "Connection timeout, could not reach CSharp server on" << host << ":" << _thriftServerPort; apache::thrift::GlobalOutput.setOutputFunction( apache::thrift::TOutput::errorTimeWrapper); @@ -332,6 +332,7 @@ class CsharpServiceHandler : virtual public LanguageServiceIf cc::service::csharp::CSharpQueryHandler _csharpQueryHandler; static int _thriftServerPort; + static int getThriftServerPort(); }; } // language diff --git a/plugins/csharp/service/src/csharpservice.cpp b/plugins/csharp/service/src/csharpservice.cpp index 7d44b417d..a8e4e8ec4 100644 --- a/plugins/csharp/service/src/csharpservice.cpp +++ b/plugins/csharp/service/src/csharpservice.cpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace cc { @@ -15,7 +16,7 @@ namespace fs = boost::filesystem; namespace bp = boost::process; namespace pt = boost::property_tree; -int CsharpServiceHandler::_thriftServerPort = 9091; +int CsharpServiceHandler::_thriftServerPort = getThriftServerPort(); CsharpServiceHandler::CsharpServiceHandler( std::shared_ptr db_, @@ -46,6 +47,26 @@ CsharpServiceHandler::CsharpServiceHandler( } } +int CsharpServiceHandler::getThriftServerPort() +{ + boost::asio::io_service service; + boost::system::error_code ec; + + for (int port = 9091; port <= 65535; ++port){ + boost::asio::ip::tcp::acceptor acceptor(service); + boost::asio::ip::tcp::endpoint endPoint(boost::asio::ip::tcp::v4(), port); + acceptor.open(endPoint.protocol(), ec); + acceptor.bind(endPoint, ec); + + if (!ec) { + acceptor.close(ec); + return port; + } + } + + return 9091; +} + std::string CsharpServiceHandler::getDbString() { pt::ptree _pt; @@ -56,7 +77,6 @@ std::string CsharpServiceHandler::getDbString() void CsharpServiceHandler::getFileTypes(std::vector& return_) { - //LOG(info) << "CsharpServiceHandler getFileTypes"; return_.push_back("CS"); return_.push_back("Dir"); } @@ -73,7 +93,6 @@ void CsharpServiceHandler::getAstNodeInfo( std::stringstream ss; ss << file; return_.range.file = ss.str(); - //LOG(info) << "csharpQuery.getAstNodeInfo: file = " << return_.range.file; } void CsharpServiceHandler::getAstNodeInfoByPosition( @@ -91,7 +110,6 @@ void CsharpServiceHandler::getSourceText( std::string& return_, const core::AstNodeId& astNodeId_) { - LOG(info) << "getSourceText"; core::FileRange fileRange; _csharpQueryHandler.getFileRange(fileRange, astNodeId_); @@ -117,7 +135,6 @@ void CsharpServiceHandler::getProperties( std::map& return_, const core::AstNodeId& astNodeId_) { - //LOG(info) << "getProperties"; _csharpQueryHandler.getProperties(return_, astNodeId_); } @@ -125,7 +142,6 @@ void CsharpServiceHandler::getDocumentation( std::string& return_, const core::AstNodeId& astNodeId_) { - LOG(info) << "getDocumentation"; _csharpQueryHandler.getDocumentation(return_, astNodeId_); } @@ -133,7 +149,7 @@ void CsharpServiceHandler::getDiagramTypes( std::map& return_, const core::AstNodeId& astNodeId_) { - LOG(info) << "getDiagramTypes"; + //TODO //csharpQueryHandler.getDiagramTypes(return_, astNodeId_); } @@ -142,7 +158,7 @@ void CsharpServiceHandler::getDiagram( const core::AstNodeId& astNodeId_, const std::int32_t diagramId_) { - LOG(info) << "getDiagram"; + //TODO //csharpQueryHandler.getDiagram(return_, astNodeId_, diagramId_); } @@ -150,14 +166,14 @@ void CsharpServiceHandler::getDiagramLegend( std::string& return_, const std::int32_t diagramId_) { - LOG(info) << "getDiagramLegend"; + //TODO } void CsharpServiceHandler::getFileDiagramTypes( std::map& return_, const core::FileId& fileId_) { - LOG(info) << "getFileDiagramTypes"; + //TODO } void CsharpServiceHandler::getFileDiagram( @@ -165,21 +181,20 @@ void CsharpServiceHandler::getFileDiagram( const core::FileId& fileId_, const int32_t diagramId_) { - LOG(info) << "getFileDiagram"; + //TODO } void CsharpServiceHandler::getFileDiagramLegend( std::string& return_, const std::int32_t diagramId_) { - LOG(info) << "getFileDiagramLegend"; + //TODO } void CsharpServiceHandler::getReferenceTypes( std::map& return_, const core::AstNodeId& astNodeId_) { - //LOG(info) << "getReferenceTypes"; _csharpQueryHandler.getReferenceTypes(return_, astNodeId_); } @@ -187,7 +202,6 @@ std::int32_t CsharpServiceHandler::getReferenceCount( const core::AstNodeId& astNodeId_, const std::int32_t referenceId_) { - //LOG(info) << "getReferenceCount"; return _csharpQueryHandler.getReferenceCount(astNodeId_, referenceId_); } @@ -197,7 +211,6 @@ void CsharpServiceHandler::getReferences( const std::int32_t referenceId_, const std::vector& tags_) { - //LOG(info) << "getReferences"; _csharpQueryHandler.getReferences(return_, astNodeId_, referenceId_, tags_); std::vector ret; for (AstNodeInfo nodeinfo : return_) @@ -222,7 +235,6 @@ void CsharpServiceHandler::getReferencesInFile( const core::FileId& /* fileId_ */, const std::vector& /* tags_ */) { - //LOG(info) << "getReferencesInFile"; // TODO } @@ -233,7 +245,6 @@ void CsharpServiceHandler::getReferencesPage( const std::int32_t /* pageSize_ */, const std::int32_t /* pageNo_ */) { - //LOG(info) << "getReferencesPage"; // TODO } @@ -241,7 +252,6 @@ void CsharpServiceHandler::getFileReferenceTypes( std::map& return_, const core::FileId& /* fileId_*/) { - //LOG(info) << "getFileReferenceTypes"; _csharpQueryHandler.getFileReferenceTypes(return_); } @@ -249,7 +259,6 @@ std::int32_t CsharpServiceHandler::getFileReferenceCount( const core::FileId& fileId_, const std::int32_t referenceId_) { - //LOG(info) << "getFileReferenceCount"; model::FilePtr file = _transaction([&, this](){ return _db->query_one( FileQuery::id == std::stoull(fileId_)); @@ -262,7 +271,6 @@ void CsharpServiceHandler::getFileReferences( const core::FileId& fileId_, const std::int32_t referenceId_) { - //LOG(info) << "getFileReferences"; model::FilePtr file = _transaction([&, this](){ return _db->query_one( FileQuery::id == std::stoull(fileId_)); @@ -274,7 +282,7 @@ void CsharpServiceHandler::getSyntaxHighlight( std::vector& return_, const core::FileRange& range_) { - LOG(info) << "getSyntaxHighlight"; + //TODO /* std::vector content; _transaction([&, this]() { diff --git a/plugins/csharp/service/src_csharp/CSharpQueryHandler.cs b/plugins/csharp/service/src_csharp/CSharpQueryHandler.cs index a221b65b9..dd63fa6ec 100644 --- a/plugins/csharp/service/src_csharp/CSharpQueryHandler.cs +++ b/plugins/csharp/service/src_csharp/CSharpQueryHandler.cs @@ -13,13 +13,15 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.Diagnostics; -using language; +using CodeCompass.Service.Language; using cc.service.csharp; using CSharpParser.model; public class CSharpQueryHandler : CsharpService.IAsync { private CsharpDbContext dbContext; + + private QueryHelper queryHelper = new QueryHelper(); public CSharpQueryHandler(string connenctionString) { // Converting the connectionstring into Entity Framework style connection string @@ -43,62 +45,6 @@ public CSharpQueryHandler(string connenctionString) dbContext = new CsharpDbContext(options); } - private language.AstNodeInfo createAstNodeInfo(CsharpAstNode node) - { - language.AstNodeInfo ret = new language.AstNodeInfo(); - ret.Id = node.Id.ToString(); - ret.AstNodeValue = node.AstValue; - ret.AstNodeType = node.RawKind.ToString(); - ret.SymbolType = node.AstSymbolType.ToString(); - ret.Range = getFileRange(node); - - List tags = new List(); - tags.Add(node.Accessibility.ToString()); - - ret.Tags = tags; - - return ret; - } - - private List createAstNodeInfoList(List nodeList) - { - var ret = new List(); - foreach (var node in nodeList) - { - var astNodeInfo = createAstNodeInfo(node); - ret.Add(astNodeInfo); - } - - return ret; - } - - private FileRange getFileRange(CsharpAstNode node) - { - FileRange fileRange = new FileRange(); - Position startPosition = new Position - { - Line = (int)node.Location_range_start_line, - Column = (int)node.Location_range_start_column - }; - - Position endPosition = new Position - { - Line = (int)node.Location_range_end_line, - Column = (int)node.Location_range_end_column - }; - - Range range = new Range - { - Startpos = startPosition, - Endpos = endPosition - }; - - fileRange.File = node.Path; - fileRange.Range = range; - - return fileRange; - } - private CsharpAstNode queryCsharpAstNode(string astNodeId) { CsharpAstNode ret; @@ -285,14 +231,14 @@ private List queryEvents(CsharpAstNode astNode) } - public async Task getAstNodeInfo(string astNodeId, + public async Task getAstNodeInfo(string astNodeId, CancellationToken cancellationToken = default(CancellationToken)) { System.Console.WriteLine("[CSharpService] getAstNodeInfoAsync"); - return await Task.FromResult(new language.AstNodeInfo()); + return await Task.FromResult(new AstNodeInfo()); } - public async Task getAstNodeInfoByPosition(string path_, + public async Task getAstNodeInfoByPosition(string path_, Position pos_, CancellationToken cancellationToken = default(CancellationToken)) { @@ -308,7 +254,7 @@ private List queryEvents(CsharpAstNode astNode) if (nodes.Count() == 0) { System.Console.WriteLine("[CSharpService error] There are no AstNode at this position!"); - return await Task.FromResult(new language.AstNodeInfo()); + return await Task.FromResult(new AstNodeInfo()); } var minNode = nodes.FirstOrDefault(); @@ -318,7 +264,7 @@ private List queryEvents(CsharpAstNode astNode) minNode = node; } - return await Task.FromResult(createAstNodeInfo(minNode)); + return await Task.FromResult(queryHelper.createAstNodeInfo(minNode)); } public async Task> getProperties(string astNodeIds, @@ -422,7 +368,7 @@ public async Task getDocumentation(string astNodeId, public async Task getFileRange(string astNodeId, CancellationToken cancellationToken = default(CancellationToken)) { - return await Task.FromResult(getFileRange(queryCsharpAstNode(astNodeId))); + return await Task.FromResult(queryHelper.getFileRange(queryCsharpAstNode(astNodeId))); } public async Task> getReferenceTypes(string astNodeId, @@ -570,65 +516,65 @@ public async Task getReferenceCount(string astNodeId, int referenceId, return await Task.FromResult(ret); } - public async Task> getReferences(string astNodeId, + public async Task> getReferences(string astNodeId, int referenceId, List tags, CancellationToken cancellationToken = default(CancellationToken)) { var node = queryCsharpAstNode(astNodeId); - var ret = new List(); + var ret = new List(); switch ((ReferenceType)referenceId) { case ReferenceType.USAGE: - ret = createAstNodeInfoList(queryInvocations(node)); + ret = queryHelper.createAstNodeInfoList(queryInvocations(node)); break; case ReferenceType.DEFINITION: case ReferenceType.DECLARATION: - ret = createAstNodeInfoList(queryDeclarators(node)); + ret = queryHelper.createAstNodeInfoList(queryDeclarators(node)); break; case ReferenceType.EVALUATION: - ret = createAstNodeInfoList(queryEvals(node)); + ret = queryHelper.createAstNodeInfoList(queryEvals(node)); break; case ReferenceType.PARAMETER: - ret = createAstNodeInfoList(queryParams(node)); + ret = queryHelper.createAstNodeInfoList(queryParams(node)); break; case ReferenceType.LOCAL_VAR: - ret = createAstNodeInfoList(queryLocals(node)); + ret = queryHelper.createAstNodeInfoList(queryLocals(node)); break; case ReferenceType.DATA_MEMBER: - ret = createAstNodeInfoList(queryProperties(node)); + ret = queryHelper.createAstNodeInfoList(queryProperties(node)); break; case ReferenceType.THIS_CALLS: - ret = createAstNodeInfoList(queryCalls(node)); + ret = queryHelper.createAstNodeInfoList(queryCalls(node)); break; case ReferenceType.CALLEE: - ret = createAstNodeInfoList(queryCallees(node)); + ret = queryHelper.createAstNodeInfoList(queryCallees(node)); break; case ReferenceType.CALLER: - ret = createAstNodeInfoList(queryCallers(node)); + ret = queryHelper.createAstNodeInfoList(queryCallers(node)); break; case ReferenceType.ENUM_CONSTANTS: - ret = createAstNodeInfoList(queryEnumConsts(node)); + ret = queryHelper.createAstNodeInfoList(queryEnumConsts(node)); break; case ReferenceType.METHOD: - ret = createAstNodeInfoList(queryMethods(node)); + ret = queryHelper.createAstNodeInfoList(queryMethods(node)); break; case ReferenceType.CONSTRUCTOR: - ret = createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Constructor)); + ret = queryHelper.createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Constructor)); break; case ReferenceType.DESTRUCTOR: - ret = createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Destuctor)); + ret = queryHelper.createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Destuctor)); break; case ReferenceType.OPERATOR: - ret = createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Operator)); + ret = queryHelper.createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Operator)); break; case ReferenceType.ACCESSOR: - ret = createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Accessor)); + ret = queryHelper.createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Accessor)); break; case ReferenceType.DELEGATE: - ret = createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Delegate)); + ret = queryHelper.createAstNodeInfoList(queryMethodType(node, MethodTypeEnum.Delegate)); break; case ReferenceType.EVENT: - ret = createAstNodeInfoList(queryEvents(node)); + ret = queryHelper.createAstNodeInfoList(queryEvents(node)); break; default: System.Console.WriteLine($"[CSharpService] {(ReferenceType)referenceId}"+ @@ -654,11 +600,11 @@ public async Task getFileReferenceCount(string path, int referenceId, return await Task.FromResult(0); } - public async Task> getFileReferences(string path, + public async Task> getFileReferences(string path, int referenceId, CancellationToken cancellationToken = default(CancellationToken)) { - return await Task.FromResult(new List()); + return await Task.FromResult(new List()); } public async Task> getDiagramTypes(string astNodeId, @@ -673,12 +619,11 @@ public async Task getDiagram(string astNodeId, int diagramId, return await Task.FromResult("Diagram"); } - public async Task> getSyntaxHighlight(FileRange range, + public async Task> getSyntaxHighlight(FileRange range, List content, CancellationToken cancellationToken = default(CancellationToken)) { - return await Task.FromResult(new List()); + return await Task.FromResult(new List()); } - } \ No newline at end of file diff --git a/plugins/csharp/service/src_csharp/CSharpQueryHelper.cs b/plugins/csharp/service/src_csharp/CSharpQueryHelper.cs new file mode 100644 index 000000000..c97cc46e4 --- /dev/null +++ b/plugins/csharp/service/src_csharp/CSharpQueryHelper.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.EntityFrameworkCore; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System.Diagnostics; +using CodeCompass.Service.Language; +using cc.service.csharp; +using CSharpParser.model; + +class QueryHelper + { + public AstNodeInfo createAstNodeInfo(CsharpAstNode node) + { + AstNodeInfo ret = new AstNodeInfo(); + ret.Id = node.Id.ToString(); + ret.AstNodeValue = node.AstValue; + ret.AstNodeType = node.RawKind.ToString(); + ret.SymbolType = node.AstSymbolType.ToString(); + ret.Range = getFileRange(node); + + List tags = new List(); + tags.Add(node.Accessibility.ToString()); + + ret.Tags = tags; + + return ret; + } + + public List createAstNodeInfoList(List nodeList) + { + var ret = new List(); + foreach (var node in nodeList) + { + var astNodeInfo = createAstNodeInfo(node); + ret.Add(astNodeInfo); + } + + return ret; + } + + public FileRange getFileRange(CsharpAstNode node) + { + FileRange fileRange = new FileRange(); + Position startPosition = new Position + { + Line = (int)node.Location_range_start_line, + Column = (int)node.Location_range_start_column + }; + + Position endPosition = new Position + { + Line = (int)node.Location_range_end_line, + Column = (int)node.Location_range_end_column + }; + + Range range = new Range + { + Startpos = startPosition, + Endpos = endPosition + }; + + fileRange.File = node.Path; + fileRange.Range = range; + + return fileRange; + } + } \ No newline at end of file diff --git a/plugins/csharp/service/src_csharp/CSharpQueryServer.cs b/plugins/csharp/service/src_csharp/CSharpQueryServer.cs index 955de23a1..a5a609813 100644 --- a/plugins/csharp/service/src_csharp/CSharpQueryServer.cs +++ b/plugins/csharp/service/src_csharp/CSharpQueryServer.cs @@ -17,7 +17,7 @@ using Thrift.Transport.Server; using Thrift.Processor; using System.Diagnostics; -using language; +using CodeCompass.Service.Language; using cc.service.csharp; using CSharpParser.model; diff --git a/service/language/language.thrift b/service/language/language.thrift index 6fc79d267..03c7dc279 100644 --- a/service/language/language.thrift +++ b/service/language/language.thrift @@ -2,7 +2,7 @@ include "../project/common.thrift" include "../project/project.thrift" namespace cpp cc.service.language -namespace netstd language +namespace netstd CodeCompass.Service.Language struct AstNodeInfo {