Skip to content

Commit dc6dac7

Browse files
Remove nuget, fix several issues, update deps
1 parent 8a4eb28 commit dc6dac7

8 files changed

Lines changed: 27 additions & 189 deletions

File tree

DeveloperCore.REPL.sln

Lines changed: 0 additions & 31 deletions
This file was deleted.

DeveloperCore.REPL.slnx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<Solution>
2+
<Project Path="DeveloperCore.REPL/DeveloperCore.REPL.vbproj" />
3+
<Project Path="VBRepl/VBRepl.vbproj" />
4+
</Solution>

DeveloperCore.REPL/DeveloperCore.REPL.vbproj

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@
66
</PropertyGroup>
77

88
<ItemGroup>
9-
<PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.7.0" />
10-
<PackageReference Include="NuGet.Common" Version="6.7.0" />
11-
<PackageReference Include="NuGet.PackageManagement" Version="6.7.0" />
12-
<PackageReference Include="NuGet.ProjectModel" Version="6.7.0" />
13-
<PackageReference Include="NuGet.Protocol" Version="6.7.0" />
9+
<PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.14.0" />
1410
</ItemGroup>
1511

1612
</Project>

DeveloperCore.REPL/IExpression.vb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
Public Interface IExpression
2-
Function Evaluate(state As Dictionary(Of String, Object)) As Object
3-
End Interface
2+
Function Evaluate(state As Dictionary(Of String, Object)) As Task(Of Object)
3+
End Interface

DeveloperCore.REPL/REPL.vb

Lines changed: 12 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,10 @@
11
Imports System.IO
2-
Imports System.Threading
32
Imports Microsoft.CodeAnalysis
43
Imports Microsoft.CodeAnalysis.Emit
54
Imports Microsoft.CodeAnalysis.VisualBasic
65
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
7-
Imports NuGet.Common
8-
Imports NuGet.Configuration
9-
Imports NuGet.PackageManagement
10-
Imports NuGet.Packaging
11-
Imports NuGet.Packaging.Core
12-
Imports NuGet.ProjectManagement
13-
Imports NuGet.Protocol.Core.Types
14-
Imports NuGet.Resolver
15-
'TODO: Child variables only
16-
'TODO: Async
6+
'TODO: Async - Can't parse Await with ParseExecutableStatement
177
'TODO: Non method things
18-
'TODO: Maybe replace variable references with dictionary lookups
198
'TODO: State save should be inserted before all returns
209
Public Class REPL
2110
Private _imports As New List(Of ImportsStatementSyntax)
@@ -24,17 +13,17 @@ Public Class REPL
2413
Private _trees As New List(Of SyntaxTree)
2514
Private ReadOnly _nugetCache As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DeveloperCore.REPL", "NuGetCache")
2615

27-
Public Function Evaluate(str As String) As EvaluationResults
16+
Public Async Function Evaluate(str As String) As Task(Of EvaluationResults)
2817
Dim newStatement As StatementSyntax = SyntaxFactory.ParseExecutableStatement(str)
2918
Dim comp As VisualBasicCompilation = GetCompilation(newStatement)
3019
Using ms As New MemoryStream
3120
Dim res As EmitResult = comp.Emit(ms)
32-
Dim results As Object
21+
Dim results As Object = Nothing
3322
If res.Success Then
3423
If TypeOf newStatement Is ImportsStatementSyntax Then
3524
_imports.Add(newStatement)
3625
End If
37-
results = Run(ms)
26+
results = Await Run(ms)
3827
End If
3928
Return New EvaluationResults(comp.GetDiagnostics.Where(Function(x) x.Severity <> DiagnosticSeverity.Hidden).ToArray, results)
4029
End Using
@@ -56,8 +45,9 @@ Public Class REPL
5645
Private Function GetMethod(stateName As String, statement As StatementSyntax) As MethodBlockSyntax
5746
Dim method As MethodBlockSyntax = SyntaxCreator.GetMethod(stateName)
5847
Dim defaultReturn As ReturnStatementSyntax = SyntaxFactory.ReturnStatement(SyntaxFactory.NothingLiteralExpression(SyntaxFactory.ParseToken("Nothing")))
48+
Dim taskYield As ExpressionStatementSyntax = SyntaxFactory.ExpressionStatement(SyntaxFactory.AwaitExpression(SyntaxFactory.ParseExpression("System.Threading.Tasks.Task.Yield()")))
5949
If TypeOf statement Is ImportsStatementSyntax Then
60-
method = method.AddStatements(defaultReturn)
50+
method = method.AddStatements(taskYield, defaultReturn)
6151
Else
6252
Dim stateVars As New List(Of VariableDeclaratorSyntax)
6353
For Each key As String In _state.Keys
@@ -66,7 +56,7 @@ Public Class REPL
6656
Next
6757
Dim varDeclaration As LocalDeclarationStatementSyntax = SyntaxFactory.LocalDeclarationStatement(New SyntaxTokenList().Add(SyntaxFactory.ParseToken("Dim")), New SeparatedSyntaxList(Of VariableDeclaratorSyntax)().AddRange(stateVars))
6858
Dim varUpdates As New List(Of StatementSyntax)
69-
Dim vars As VariableDeclaratorSyntax() = varDeclaration.Declarators.Concat(statement.DescendantNodes.OfType(Of VariableDeclaratorSyntax)).ToArray
59+
Dim vars As VariableDeclaratorSyntax() = varDeclaration.Declarators.Concat(statement.ChildNodes.OfType(Of VariableDeclaratorSyntax)).ToArray
7060
For Each var As VariableDeclaratorSyntax In vars
7161
Dim name As String = var.Names.First.Identifier.Text
7262
If Not _state.ContainsKey(name) Then
@@ -75,17 +65,17 @@ Public Class REPL
7565
varUpdates.Add(SyntaxFactory.ParseExecutableStatement($"{stateName}(""{name}"") = {name}"))
7666
End If
7767
Next
78-
method = method.WithStatements(New SyntaxList(Of StatementSyntax)().AddRange({varDeclaration, statement}).AddRange(varUpdates).Add(defaultReturn))
68+
method = method.WithStatements(New SyntaxList(Of StatementSyntax)().AddRange({varDeclaration, statement}).AddRange(varUpdates).Add(taskYield).Add(defaultReturn))
7969
End If
8070
Return method
8171
End Function
8272

83-
Private Function Run(ms As MemoryStream) As Object
73+
Private Async Function Run(ms As MemoryStream) As Task(Of Object)
8474
Dim asm As Reflection.Assembly = Reflection.Assembly.Load(ms.ToArray)
8575
Dim type As Type = asm.GetType("Expression")
8676
Dim obj As IExpression = Activator.CreateInstance(type)
8777
Try
88-
Return obj.Evaluate(_state)
78+
Return Await obj.Evaluate(_state)
8979
Catch ex As Exception
9080
Return ex
9181
End Try
@@ -139,40 +129,16 @@ Public Class REPL
139129
Return result
140130
End Function
141131

142-
Public Async Function AddReference(ref As String) As Task
132+
Public Sub AddReference(ref As String)
143133
If IsValidPath(ref) AndAlso File.Exists(ref) Then
144134
Select Case Path.GetExtension(ref)
145135
Case ".dll", ".exe"
146136
_references.Add(MetadataReference.CreateFromFile(ref))
147137
Case ".vb"
148138
_trees.Add(SyntaxFactory.ParseSyntaxTree(File.ReadAllText(ref)))
149139
End Select
150-
ElseIf ref.StartsWith("nuget:") Then
151-
'TODO: Add package selector
152-
Directory.CreateDirectory(_nugetCache)
153-
Dim parts As String() = ref.Split(":"c)
154-
Dim name As String = parts(1).Trim
155-
Dim version As String = If(parts.Length > 2, parts(2).Trim, "")
156-
Dim providers As New List(Of Lazy(Of INuGetResourceProvider))
157-
providers.AddRange(Repository.Provider.GetCoreV3())
158-
Dim sourceRepository As New SourceRepository(New PackageSource("https://api.nuget.org/v3/index.json"), providers)
159-
Dim log As New Logger
160-
Dim nugetSettings As Settings = Settings.LoadDefaultSettings(_nugetCache)
161-
Dim sourceProvider As New PackageSourceProvider(nugetSettings)
162-
Dim repositoryProvider As New SourceRepositoryProvider(sourceProvider, providers)
163-
Dim project As New FolderNuGetProject(_nugetCache)
164-
Dim manager As New NuGetPackageManager(repositoryProvider, nugetSettings, _nugetCache) With {.PackagesFolderNuGetProject = project}
165-
Dim searchSource As PackageSearchResource = sourceRepository.GetResource(Of PackageSearchResource)()
166-
Dim package As IPackageSearchMetadata = (Await searchSource.SearchAsync(name, New SearchFilter(True) With {.IncludeDelisted = False, .SupportedFrameworks = {"netstandard2.0"}}, 0, 10, log, CancellationToken.None)).FirstOrDefault
167-
If package Is Nothing Then Throw New Exception($"Package {name} not found")
168-
Dim prerelease As Boolean = True
169-
Dim unListed As Boolean = False
170-
Dim resolutionContext As New ResolutionContext(DependencyBehavior.Lowest, prerelease, unListed, VersionConstraints.None)
171-
Dim context As New ProjectContext
172-
Dim identity As New PackageIdentity(package.Identity.Id, package.Identity.Version)
173-
Await manager.InstallPackageAsync(project, identity, resolutionContext, context, sourceRepository, {}, CancellationToken.None)
174140
End If
175-
End Function
141+
End Sub
176142

177143
Private Shared Function IsValidPath(path As String) As Boolean
178144
Dim fi As FileInfo = Nothing
@@ -185,97 +151,3 @@ Public Class REPL
185151
Return If(fi Is Nothing, False, True)
186152
End Function
187153
End Class
188-
189-
Public Class Logger
190-
Implements ILogger
191-
Private logs As New List(Of String)()
192-
193-
Public Sub LogDebug(data As String) Implements ILogger.LogDebug
194-
logs.Add(data)
195-
End Sub
196-
197-
Public Sub LogVerbose(data As String) Implements ILogger.LogVerbose
198-
logs.Add(data)
199-
End Sub
200-
201-
Public Sub LogInformation(data As String) Implements ILogger.LogInformation
202-
logs.Add(data)
203-
End Sub
204-
205-
Public Sub LogMinimal(data As String) Implements ILogger.LogMinimal
206-
logs.Add(data)
207-
End Sub
208-
209-
Public Sub LogWarning(data As String) Implements ILogger.LogWarning
210-
logs.Add(data)
211-
End Sub
212-
213-
Public Sub LogError(data As String) Implements ILogger.LogError
214-
logs.Add(data)
215-
End Sub
216-
217-
Public Sub LogInformationSummary(data As String) Implements ILogger.LogInformationSummary
218-
logs.Add(data)
219-
End Sub
220-
221-
Public Sub Log(level As LogLevel, data As String) Implements ILogger.Log
222-
logs.Add(data)
223-
End Sub
224-
225-
Public Sub Log(message As ILogMessage) Implements ILogger.Log
226-
logs.Add(message.Message)
227-
End Sub
228-
229-
Public Function LogAsync(level As LogLevel, data As String) As Task Implements ILogger.LogAsync
230-
logs.Add(data)
231-
Return Task.CompletedTask
232-
End Function
233-
234-
Public Function LogAsync(message As ILogMessage) As Task Implements ILogger.LogAsync
235-
logs.Add(message.Message)
236-
Return Task.CompletedTask
237-
End Function
238-
End Class
239-
240-
Public Class ProjectContext
241-
Implements INuGetProjectContext
242-
Private logs As New List(Of String)()
243-
244-
Public Function GetLogs() As List(Of String)
245-
Return logs
246-
End Function
247-
248-
Public Sub Log(level As MessageLevel, message As String, ParamArray args As Object()) Implements INuGetProjectContext.Log
249-
Dim formattedMessage = String.Format(message, args)
250-
logs.Add(formattedMessage)
251-
End Sub
252-
253-
Public Function ResolveFileConflict(message As String) As FileConflictAction Implements INuGetProjectContext.ResolveFileConflict
254-
logs.Add(message)
255-
Return FileConflictAction.Ignore
256-
End Function
257-
258-
Public Property PackageExtractionContext As PackageExtractionContext Implements INuGetProjectContext.PackageExtractionContext
259-
260-
Public ReadOnly Property ExecutionContext As NuGet.ProjectManagement.ExecutionContext Implements INuGetProjectContext.ExecutionContext
261-
262-
Public Property OriginalPackagesConfig As XDocument Implements INuGetProjectContext.OriginalPackagesConfig
263-
264-
Public Property SourceControlManagerProvider As ISourceControlManagerProvider Implements INuGetProjectContext.SourceControlManagerProvider
265-
266-
Public Sub ReportError(message As String) Implements INuGetProjectContext.ReportError
267-
logs.Add(message)
268-
End Sub
269-
270-
Public Sub Log(message As ILogMessage) Implements INuGetProjectContext.Log
271-
Log(message.Level, message.Message)
272-
End Sub
273-
274-
Public Sub ReportError(message As ILogMessage) Implements INuGetProjectContext.ReportError
275-
ReportError(message.Message)
276-
End Sub
277-
278-
Public Property ActionType As NuGetActionType Implements INuGetProjectContext.ActionType
279-
280-
Public Property OperationId As Guid Implements INuGetProjectContext.OperationId
281-
End Class
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
Imports Microsoft.CodeAnalysis
2-
Imports Microsoft.CodeAnalysis.VisualBasic
1+
Imports Microsoft.CodeAnalysis.VisualBasic
32
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
43

54
Public Class SyntaxCreator
@@ -9,7 +8,7 @@ Public Class SyntaxCreator
98
End Function
109

1110
Public Shared Function GetMethod(param As String) As MethodBlockSyntax
12-
Return SyntaxFactory.FunctionBlock(SyntaxFactory.FunctionStatement("Evaluate").AddImplementsClauseInterfaceMembers(SyntaxFactory.QualifiedName(SyntaxFactory.ParseTypeName("DeveloperCore.REPL.IExpression"), SyntaxFactory.ParseName("Evaluate"))).AddParameterListParameters(SyntaxFactory.Parameter(SyntaxFactory.ModifiedIdentifier(param)).WithAsClause(SyntaxFactory.SimpleAsClause(SyntaxFactory.ParseTypeName("System.Collections.Generic.Dictionary(Of String, Object)")))))
11+
Return SyntaxFactory.FunctionBlock(SyntaxFactory.FunctionStatement("Evaluate").AddModifiers(SyntaxFactory.Token(SyntaxKind.AsyncKeyword)).WithAsClause(SyntaxFactory.SimpleAsClause(SyntaxFactory.ParseTypeName("System.Threading.Tasks.Task(Of Object)"))).AddImplementsClauseInterfaceMembers(SyntaxFactory.QualifiedName(SyntaxFactory.ParseTypeName("DeveloperCore.REPL.IExpression"), SyntaxFactory.ParseName("Evaluate"))).AddParameterListParameters(SyntaxFactory.Parameter(SyntaxFactory.ModifiedIdentifier(param)).WithAsClause(SyntaxFactory.SimpleAsClause(SyntaxFactory.ParseTypeName("System.Collections.Generic.Dictionary(Of String, Object)")))))
1312
End Function
1413

15-
End Class
14+
End Class

VBRepl/Program.vb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ Imports Spectre.Console
33
Imports DeveloperCore.REPL
44
Imports System.Reflection
55
Public Module Program
6-
76
'TODO: Default imports
87
'TODO: Config file
98
Public Sub Main(args As String())
@@ -30,13 +29,13 @@ Public Module Program
3029
ref = ref.Substring(1, ref.Length - 2)
3130
End If
3231
Try
33-
repl.AddReference(ref).Wait()
32+
repl.AddReference(ref)
3433
Catch ex As Exception
3534
AnsiConsole.WriteException(ex)
3635
End Try
3736
Continue While
3837
End If
39-
Dim r As EvaluationResults = repl.Evaluate(res.Text)
38+
Dim r As EvaluationResults = repl.Evaluate(res.Text).Result
4039
If TypeOf r.Result Is Exception Then
4140
AnsiConsole.WriteException(r.Result)
4241
ElseIf r.Result IsNot Nothing Then
@@ -66,4 +65,4 @@ Public Module Program
6665
End Select
6766
End Function
6867

69-
End Module
68+
End Module

VBRepl/VBRepl.vbproj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
55
<RootNamespace>VBRepl</RootNamespace>
6-
<TargetFramework>net7.0</TargetFramework>
6+
<TargetFramework>net10.0</TargetFramework>
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.7.0" />
1110
<PackageReference Include="PrettyPrompt" Version="4.1.1" />
12-
<PackageReference Include="Spectre.Console" Version="0.47.0" />
11+
<PackageReference Include="Spectre.Console" Version="0.50.0" />
1312
</ItemGroup>
1413

1514
<ItemGroup>

0 commit comments

Comments
 (0)