11Imports System.IO
2- Imports System.Threading
32Imports Microsoft.CodeAnalysis
43Imports Microsoft.CodeAnalysis.Emit
54Imports Microsoft.CodeAnalysis.VisualBasic
65Imports 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
209Public 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
187153End 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
0 commit comments