Skip to content

Commit ef560b6

Browse files
committed
Add SolidityStaticAnalysis tree.
1 parent 556f6ed commit ef560b6

File tree

9 files changed

+324
-747
lines changed

9 files changed

+324
-747
lines changed

src/Stratis.VS.StratisEVM/SolidityProject/SolidityCompiler.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,18 @@ public static bool InstallSolcCompiler(string compilerVersion)
117117
{
118118
return true;
119119
}
120+
VSUtil.LogInfo("StratisEVM", $"Installing solc {compilerVersion} compiler...");
120121
var solcselectpath = Path.Combine(TaskToolsDir, "solc-select.exe");
121122
if (!File.Exists(solcselectpath))
122123
{
123-
VSUtil.LogError("StratsEVM", "Could not find solc-select executable.");
124+
VSUtil.LogError("StratsEVM", $"Could not find solc-select executable. Could not install solc {compilerVersion} compiler");
124125
return false;
125126

126127
}
127128
var output = RunCmd("cmd.exe", $"/c solc-select.exe install {compilerVersion}", TaskToolsDir);
128129
if (CheckRunCmdOutput(output, $"Version '{compilerVersion}' installed") && File.Exists(solcPath))
129130
{
130-
VSUtil.LogInfo("StratisEVM", $"solc {compilerVersion} compiler installed at {solcPath}.");
131+
VSUtil.LogInfo("StratisEVM", $"solc {compilerVersion} compiler installed.");
131132
return true;
132133
}
133134
else

src/Stratis.VS.StratisEVM/SolidityProject/SolidityProjectMenuCommands.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ private async Task AnalyzeFileAsync()
124124
var projectdir = Path.GetDirectoryName(project.FileName);
125125
var filepath = item.ProjectItem.FileNames[1];
126126
var outputDir = Path.Combine(Path.GetDirectoryName(project.FileName), project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString());
127-
var r = await SolidityCompiler.AnalyzeAsync(Runtime.GetWindowsRelativePath(filepath, projectdir), projectdir, outputDir, "0.8.27");
127+
var compilerVersion = VSUtil.GetProjectProperty(project, "CompilerVersion");
128+
var r = await SolidityCompiler.AnalyzeAsync(Runtime.GetWindowsRelativePath(filepath, projectdir), projectdir, outputDir, compilerVersion);
128129

129130
var window = (SolidityStaticAnalysisToolWindow) await this.package.ShowToolWindowAsync(typeof(SolidityStaticAnalysisToolWindow), 0, true, this.package.DisposalToken);
130131
window.control.AnalyzeProjectFileItem(item.ProjectItem, r);

src/Stratis.VS.StratisEVM/Stratis.VS.StratisEVM.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060
<Compile Include="UI\RunSmartContract\RunSmartContractToolWindowControl.xaml.cs">
6161
<DependentUpon>RunSmartContractToolWindowControl.xaml</DependentUpon>
6262
</Compile>
63+
<Compile Include="UI\SolidityStaticAnalysis\SolidityStaticAnalysisTree.cs" />
64+
<Compile Include="UI\SolidityStaticAnalysis\SolidityStaticAnalysisViewModel.cs" />
6365
<Compile Include="UI\SolidityStaticAnalysis\SolidityStaticAnalysisToolWindow.cs" />
6466
<Compile Include="UI\SolidityStaticAnalysis\SolidityStaticAnalysisToolWindowCommand.cs" />
6567
<Compile Include="UI\SolidityStaticAnalysis\SolidityStaticAnalysisToolWindowControl.xaml.cs">
@@ -409,7 +411,6 @@
409411
</ItemGroup>
410412
<ItemGroup>
411413
<Folder Include="BuildSystem\Tools\" />
412-
<Folder Include="UI\SolidityStaticAnalysis\Resources\" />
413414
</ItemGroup>
414415
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
415416
<Import Project="$(VSToolsPath)\VSSDK\Microsoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />

src/Stratis.VS.StratisEVM/UI/BlockchainExplorer/BlockchainViewModel.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
using Microsoft.VisualStudio.Shell;
2-
using Newtonsoft.Json;
3-
using Newtonsoft.Json.Serialization;
4-
using Stratis.DevEx;
5-
using Stratis.DevEx.Ethereum;
6-
using Stratis.DevEx.Ethereum.Explorers;
7-
using System;
1+
using System;
82
using System.Collections.Generic;
93
using System.Collections.ObjectModel;
104
using System.Collections.Specialized;
@@ -16,6 +10,15 @@
1610
using System.Security.Cryptography;
1711
using System.Text;
1812
using System.Threading.Tasks;
13+
14+
using Microsoft.VisualStudio.Shell;
15+
using Newtonsoft.Json;
16+
using Newtonsoft.Json.Serialization;
17+
18+
using Stratis.DevEx;
19+
using Stratis.DevEx.Ethereum;
20+
using Stratis.DevEx.Ethereum.Explorers;
21+
1922
using static Stratis.DevEx.Result;
2023

2124
namespace Stratis.VS.StratisEVM.UI.ViewModel

src/Stratis.VS.StratisEVM/UI/SolidityStaticAnalysis/SolidityStaticAnalysisResources.xaml

Lines changed: 41 additions & 721 deletions
Large diffs are not rendered by default.

src/Stratis.VS.StratisEVM/UI/SolidityStaticAnalysis/SolidityStaticAnalysisToolWindowControl.xaml

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,32 @@
1212
Background="{DynamicResource {x:Static vsshell:VsBrushes.WindowKey}}"
1313
Foreground="{DynamicResource {x:Static vsshell:VsBrushes.WindowTextKey}}"
1414
Name="SolidityAnalysisToolWindow">
15+
<UserControl.Resources>
16+
<ResourceDictionary>
17+
<ResourceDictionary.MergedDictionaries>
18+
<ui:ThemesDictionary Theme="{x:Static stratisui:VSTheme.ApplicationThemeGuess}" />
19+
<ui:ControlsDictionary />
20+
<ResourceDictionary Source="SolidityStaticAnalysisResources.xaml" />
21+
</ResourceDictionary.MergedDictionaries>
22+
<!-- The view model that provides the data for the trees -->
23+
<vm:SolidityStaticAnalysisViewModel x:Key="StaticAnalysis" />
24+
</ResourceDictionary>
25+
</UserControl.Resources>
26+
1527
<Grid>
1628
<Grid.RowDefinitions>
1729
<RowDefinition />
1830
</Grid.RowDefinitions>
19-
20-
<StackPanel Orientation="Vertical">
21-
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top">
22-
<ui:Button Name="AnalyzeButton" Appearance="Primary" Content="Analyze" Margin="0,10,0,0" Width="100" Height="36" Click="AnalyzeButton_Click" />
23-
24-
</StackPanel>
31+
<StackPanel Orientation="Vertical" Grid.Row="0">
32+
<stratisui:SolidityStaticAnalysisTree x:Name="SolidityStaticAnalysisTree"
33+
Items="{Binding Source={StaticResource StaticAnalysis}, Path=Objects}"
34+
TreeNodeStyle="{StaticResource TreeViewItemStyle}"
35+
TreeStyle="{StaticResource TreeViewStyle}"
36+
NodeSortDescriptions="{StaticResource AscendingNames}"
37+
SelectNodesOnRightClick="True"
38+
IsLazyLoading="False"
39+
Margin="0,0,0,10" />
2540
</StackPanel>
41+
<ContentPresenter x:Name="RootContentDialog" Grid.Row="0"/>
2642
</Grid>
2743
</UserControl>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Windows.Input;
4+
using System.Windows.Controls;
5+
using System.Linq;
6+
using System.Windows.Media.Imaging;
7+
8+
using Hardcodet.Wpf.GenericTreeView;
9+
10+
using Stratis.DevEx;
11+
using Stratis.VS.StratisEVM.UI.ViewModel;
12+
13+
namespace Stratis.VS.StratisEVM.UI
14+
{
15+
public class SolidityStaticAnalysisTree : TreeViewBase<SolidityStaticAnalysisInfo>
16+
{
17+
#region Properties
18+
19+
20+
public SolidityStaticAnalysisInfo RootItem => Items?.First();
21+
#endregion
22+
23+
#region Overriden Members
24+
public override string GetItemKey(SolidityStaticAnalysisInfo item) => item.Key;
25+
26+
public override ICollection<SolidityStaticAnalysisInfo> GetChildItems(SolidityStaticAnalysisInfo parent) => parent.Children;
27+
28+
public override SolidityStaticAnalysisInfo GetParentItem(SolidityStaticAnalysisInfo item) => item.Parent;
29+
30+
protected override TreeViewItem CreateTreeViewItem(SolidityStaticAnalysisInfo data)
31+
{
32+
var item = base.CreateTreeViewItem(data);
33+
34+
return item;
35+
}
36+
#endregion
37+
38+
#region Methods
39+
40+
#endregion
41+
}
42+
}
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
using Newtonsoft.Json;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Collections.ObjectModel;
5+
using System.Collections.Specialized;
6+
using System.ComponentModel;
7+
using System.Linq;
8+
using System.Net.Http;
9+
using System.Text;
10+
using System.Threading.Tasks;
11+
12+
using Stratis.DevEx;
13+
14+
namespace Stratis.VS.StratisEVM.UI.ViewModel
15+
{
16+
public enum SolidityStaticAnalysisInfoKind
17+
{
18+
Folder,
19+
Detector
20+
}
21+
22+
public class SolidityStaticAnalysisInfo
23+
{
24+
#region Constructors
25+
public SolidityStaticAnalysisInfo(SolidityStaticAnalysisInfoKind kind, string name, SolidityStaticAnalysisInfo parent = null, Dictionary<string, object> data = null)
26+
{
27+
Kind = kind;
28+
Name = name;
29+
Parent = parent;
30+
Data = data;
31+
}
32+
#endregion
33+
34+
#region Properties
35+
public SolidityStaticAnalysisInfoKind Kind { get; set; }
36+
37+
public string Name { get; set; }
38+
39+
public Dictionary<string, object> Data { get; } = new Dictionary<string, object>();
40+
41+
[JsonProperty(ItemIsReference = true)]
42+
public SolidityStaticAnalysisInfo Parent { get; set; }
43+
44+
[JsonProperty(ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
45+
public ObservableCollection<SolidityStaticAnalysisInfo> Children = new ObservableCollection<SolidityStaticAnalysisInfo>();
46+
47+
public string Key => ((this.Parent?.Key) ?? "Root") + "_" + this.Kind + "_" + this.Name;
48+
49+
[JsonIgnore]
50+
public string ToolTip
51+
{
52+
get
53+
{
54+
switch (Kind)
55+
{
56+
default:
57+
return "";
58+
}
59+
}
60+
}
61+
62+
[JsonIgnore]
63+
public string DisplayName
64+
{
65+
get
66+
{
67+
switch (Kind)
68+
{
69+
default:
70+
return Name;
71+
}
72+
}
73+
}
74+
#endregion
75+
76+
#region Methods
77+
public SolidityStaticAnalysisInfo AddChild(string name, SolidityStaticAnalysisInfoKind kind, Dictionary<string, object> data = null)
78+
{
79+
var info = new SolidityStaticAnalysisInfo(kind, name, this, data);
80+
Children.Add(info);
81+
return info;
82+
}
83+
84+
public SolidityStaticAnalysisInfo AddFolder(string name) => AddChild(name, SolidityStaticAnalysisInfoKind.Folder);
85+
86+
#endregion
87+
}
88+
89+
public class SolidityStaticAnalysisViewModel : INotifyPropertyChanged
90+
{
91+
#region Constructors
92+
public SolidityStaticAnalysisViewModel()
93+
{
94+
Objects = CreateInitialTreeData();
95+
}
96+
#endregion
97+
98+
#region Fields
99+
internal ObservableCollection<SolidityStaticAnalysisInfo> objects;
100+
#endregion
101+
102+
#region Properties
103+
public ObservableCollection<SolidityStaticAnalysisInfo> Objects
104+
{
105+
get => objects;
106+
set
107+
{
108+
if (objects != null)
109+
{
110+
objects.CollectionChanged -= OnRootCollectionChanged;
111+
}
112+
113+
objects = value;
114+
if (value != null)
115+
{
116+
value.CollectionChanged += OnRootCollectionChanged;
117+
}
118+
119+
RaisePropertyChangedEvent("Objects");
120+
}
121+
}
122+
123+
public string AssemblyLocation => Runtime.AssemblyLocation;
124+
#endregion
125+
126+
#region Methods
127+
private void OnRootCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) =>
128+
RaisePropertyChangedEvent("Objects");
129+
130+
/// <summary>
131+
/// Fires the <see cref="PropertyChanged"/> event for a
132+
/// given property.
133+
/// </summary>
134+
/// <param name="propertyName">The changed property.</param>
135+
private void RaisePropertyChangedEvent(string propertyName)
136+
{
137+
if (PropertyChanged != null)
138+
{
139+
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
140+
}
141+
}
142+
143+
public SolidityStaticAnalysisInfo TryFindObjectByName(string name, SolidityStaticAnalysisInfo parent = null)
144+
{
145+
ObservableCollection<SolidityStaticAnalysisInfo> objs;
146+
objs = parent is null ? objects : parent.Children;
147+
foreach (SolidityStaticAnalysisInfo si in objs)
148+
{
149+
if (si.Name == name)
150+
{
151+
return si;
152+
}
153+
else
154+
{
155+
var b = TryFindObjectByName(name, si);
156+
if (b != null) return b;
157+
}
158+
}
159+
160+
return null;
161+
}
162+
163+
164+
public static ObservableCollection<SolidityStaticAnalysisInfo> CreateInitialTreeData()
165+
{
166+
var data = new ObservableCollection<SolidityStaticAnalysisInfo>();
167+
var root = new SolidityStaticAnalysisInfo(SolidityStaticAnalysisInfoKind.Folder, "Analysis");
168+
root.AddFolder("High");
169+
root.AddFolder("Medium");
170+
root.AddFolder("Low");
171+
root.AddFolder("Informational");
172+
root.AddFolder("Optimization");
173+
data.Add(root);
174+
return data;
175+
}
176+
#endregion
177+
178+
#region Events
179+
/// <summary>
180+
/// Refreshes the data.
181+
/// </summary>
182+
183+
184+
///<summary>
185+
///Occurs when a property value changes.
186+
///</summary>
187+
public event PropertyChangedEventHandler PropertyChanged;
188+
#endregion
189+
}
190+
}

src/Stratis.VS.StratisEVM/VSUtil.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.IO;
4-
using System.Linq;
5-
6-
using EnvDTE;
1+
using EnvDTE;
72
using Microsoft.VisualStudio;
83
using Microsoft.VisualStudio.ComponentModelHost;
9-
using Microsoft.VisualStudio.ProjectSystem.Properties;
104
using Microsoft.VisualStudio.ProjectSystem;
5+
using Microsoft.VisualStudio.ProjectSystem.Properties;
6+
using Microsoft.VisualStudio.Settings;
117
using Microsoft.VisualStudio.Shell;
128
using Microsoft.VisualStudio.Shell.Interop;
13-
using Microsoft.VisualStudio.Settings;
149
using Microsoft.VisualStudio.Shell.Settings;
15-
1610
using Stratis.DevEx;
1711
using Stratis.DevEx.Ethereum;
12+
using System;
13+
using System.Collections.Generic;
14+
using System.IO;
15+
using System.Linq;
16+
using static System.Net.Mime.MediaTypeNames;
1817

1918
namespace Stratis.VS.StratisEVM
2019
{
@@ -122,6 +121,10 @@ public static void LogToStratisEVMWindow(string text)
122121
ActivateLogOutputPane("StratisEVM");
123122
}
124123

124+
public static void LogStratisEVMInfo(string text) => LogInfo("StratisEVM", text);
125+
126+
public static void LogStratisEVMError(string text) => LogError("StratisEVM", text);
127+
125128
public static bool InitializeVSServices(IServiceProvider provider)
126129
{
127130
ThreadHelper.ThrowIfNotOnUIThread();

0 commit comments

Comments
 (0)