From 0ca6686ebf4c1448dd6dadcd8e5bcf1f83f83479 Mon Sep 17 00:00:00 2001 From: Fernando Diaz Toledano Date: Fri, 4 Oct 2024 12:10:07 +0200 Subject: [PATCH] Avoid regex --- .../CompilationEngine/CompilationEngine.cs | 9 ++++----- src/Neo.Compiler.CSharp/MethodConvert/SourceConvert.cs | 7 +++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Neo.Compiler.CSharp/CompilationEngine/CompilationEngine.cs b/src/Neo.Compiler.CSharp/CompilationEngine/CompilationEngine.cs index 4ff77fefd..7700a2db4 100644 --- a/src/Neo.Compiler.CSharp/CompilationEngine/CompilationEngine.cs +++ b/src/Neo.Compiler.CSharp/CompilationEngine/CompilationEngine.cs @@ -34,7 +34,6 @@ public class CompilationEngine(CompilationOptions options) internal CompilationOptions Options { get; private set; } = options; private static readonly MetadataReference[] CommonReferences; private static readonly Dictionary MetaReferences = []; - internal static readonly Regex s_pattern = new(@"^(Neo\.SmartContract\.Framework\.SmartContract|SmartContract\.Framework\.SmartContract|Framework\.SmartContract|SmartContract|Neo\.SmartContract\.Framework\.Nep17Token|Neo\.SmartContract\.Framework\.TokenContract|Neo.SmartContract.Framework.Nep11Token<.*>)$"); internal readonly ConcurrentDictionary Contexts = new(SymbolEqualityComparer.Default); static CompilationEngine() @@ -177,7 +176,7 @@ public List CompileProject(string csproj, List CompileProjectContracts(Compilation compilation { var classSymbol = semanticModel.GetDeclaredSymbol(classNode); allClassSymbols.Add(classSymbol); - if (classSymbol is { IsAbstract: false, DeclaredAccessibility: Accessibility.Public } && IsDerivedFromSmartContract(classSymbol, s_pattern)) + if (classSymbol is { IsAbstract: false, DeclaredAccessibility: Accessibility.Public } && IsDerivedFromSmartContract(classSymbol)) { allSmartContracts.Add(classSymbol); classDependencies[classSymbol] = []; @@ -319,12 +318,12 @@ void Visit(INamedTypeSymbol classSymbol) return sorted; } - internal static bool IsDerivedFromSmartContract(INamedTypeSymbol classSymbol, Regex pattern) + internal static bool IsDerivedFromSmartContract(INamedTypeSymbol classSymbol) { var baseType = classSymbol.BaseType; while (baseType != null) { - if (pattern.IsMatch(baseType.ToString() ?? string.Empty)) + if (baseType.ToString() == "Neo.SmartContract.Framework.SmartContract") { return true; } diff --git a/src/Neo.Compiler.CSharp/MethodConvert/SourceConvert.cs b/src/Neo.Compiler.CSharp/MethodConvert/SourceConvert.cs index f62bca423..e271ad030 100644 --- a/src/Neo.Compiler.CSharp/MethodConvert/SourceConvert.cs +++ b/src/Neo.Compiler.CSharp/MethodConvert/SourceConvert.cs @@ -13,11 +13,14 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Neo.VM; using System.Linq; +using System.Text.RegularExpressions; namespace Neo.Compiler; internal partial class MethodConvert { + internal static readonly Regex s_pattern = new(@"^(Neo\.SmartContract\.Framework\.SmartContract|SmartContract\.Framework\.SmartContract|Framework\.SmartContract|SmartContract|Neo\.SmartContract\.Framework\.Nep17Token|Neo\.SmartContract\.Framework\.TokenContract|Neo.SmartContract.Framework.Nep11Token<.*>)$"); + private void ConvertSource(SemanticModel model) { if (SyntaxNode is null) return; @@ -158,7 +161,7 @@ internal static bool NeedInstanceConstructor(IMethodSymbol symbol) if (containingClass == null) return false; // non-static methods in class if ((symbol.MethodKind == MethodKind.Constructor || symbol.MethodKind == MethodKind.SharedConstructor) - && !CompilationEngine.IsDerivedFromSmartContract(containingClass, CompilationEngine.s_pattern)) + && !CompilationEngine.IsDerivedFromSmartContract(containingClass)) // is constructor, and is not smart contract // typically seen in framework methods return true; @@ -168,7 +171,7 @@ internal static bool NeedInstanceConstructor(IMethodSymbol symbol) .DeclaringSyntaxReferences.Length == 0) // No explicit non-static constructor in class { - if (CompilationEngine.s_pattern.IsMatch(containingClass.BaseType?.ToString() ?? string.Empty)) + if (s_pattern.IsMatch(containingClass.BaseType?.ToString() ?? string.Empty)) // class itself is directly inheriting smart contract; cannot have more base classes return false; }