提交 94d1392b 编写于 作者: C Charles Stoner

Treat .csx/.vbx as regular source files not script

上级 d5da0cd3
......@@ -7677,6 +7677,36 @@ static void Main()
CleanupAllGeneratedFiles(src.Path);
}
/// <summary>
/// Script compilation should be internal only.
/// </summary>
[WorkItem(1979, "https://github.com/dotnet/roslyn/issues/1979")]
[Fact]
public void ScriptCompilationInternalOnly()
{
const string source = @"System.Console.WriteLine();";
var dir = Temp.CreateDirectory();
var file = dir.CreateFile("c.csx");
file.WriteAllText(source);
// Compiling script file with internal API should be supported.
var compilation = CreateCompilationWithMscorlib(
source,
sourceFileName: file.Path,
parseOptions: new CSharpParseOptions(kind: SourceCodeKind.Script),
options: new CSharpCompilationOptions(OutputKind.ConsoleApplication));
compilation.VerifyDiagnostics();
// Compiling with command-line compiler, should not treat .csx as script.
var compiler = new MockCSharpCompiler(null, _baseDirectory, new[] { "/nologo", "/preferreduilang:en", file.Path });
var outWriter = new StringWriter(CultureInfo.InvariantCulture);
int exitCode = compiler.Run(outWriter);
Assert.Equal(1, exitCode);
Assert.True(outWriter.ToString().Contains("(1,25): error CS1022: Type or namespace definition, or end-of-file expected"));
CleanupAllGeneratedFiles(file.Path);
}
}
[DiagnosticAnalyzer(LanguageNames.CSharp, LanguageNames.VisualBasic)]
......
......@@ -771,21 +771,9 @@ internal IEnumerable<string> ResolveRelativePaths(IEnumerable<string> paths, str
}
}
internal CommandLineSourceFile ToCommandLineSourceFile(string resolvedPath)
private CommandLineSourceFile ToCommandLineSourceFile(string resolvedPath)
{
string extension = PathUtilities.GetExtension(resolvedPath);
bool isScriptFile;
if (IsInteractive)
{
isScriptFile = !string.Equals(extension, RegularFileExtension, StringComparison.OrdinalIgnoreCase);
}
else
{
isScriptFile = string.Equals(extension, ScriptFileExtension, StringComparison.OrdinalIgnoreCase);
}
return new CommandLineSourceFile(resolvedPath, isScriptFile);
return new CommandLineSourceFile(resolvedPath, isScript: false);
}
internal IEnumerable<CommandLineSourceFile> ParseFileArgument(string arg, string baseDirectory, IList<Diagnostic> errors)
......
......@@ -7135,6 +7135,35 @@ End Class
Assert.Contains(CodeAnalysisResources.AnalyzerExecutionTimeColumnHeader, output, StringComparison.Ordinal)
CleanupAllGeneratedFiles(source)
End Sub
''' <summary>
''' Script compilation should be internal only.
''' </summary>
<WorkItem(1979, "https://github.com/dotnet/roslyn/issues/1979")>
<Fact>
Public Sub ScriptCompilationInternalOnly()
Dim source = "System.Console.WriteLine()"
Dim dir = Temp.CreateDirectory()
Dim file = dir.CreateFile("b.vbx")
file.WriteAllText(source)
' Compiling script file with internal API should be supported.
Dim compilation = CreateCompilationWithMscorlib(
<compilation>
<file name="b.vbx"><%= source %></file>
</compilation>,
parseOptions:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script),
options:=New VisualBasicCompilationOptions(OutputKind.ConsoleApplication))
compilation.VerifyDiagnostics()
' Compiling with command-line compiler, should not treat .vbx as script.
Dim cmd = New MockVisualBasicCompiler(Nothing, _baseDirectory, {"/nologo", "/preferreduilang:en", file.Path})
Dim output As StringWriter = New StringWriter()
cmd.Run(output, Nothing)
Assert.True(output.ToString().Contains("error BC30689: Statement cannot appear outside of a method body."))
CleanupAllGeneratedFiles(file.Path)
End Sub
End Class
<DiagnosticAnalyzer(LanguageNames.VisualBasic)>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册