Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: '6.0.x'
dotnet-version: '8.0.x'
- name: Build
run: dotnet build --configuration Release
working-directory: src
2 changes: 1 addition & 1 deletion .github/workflows/pre-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: '6.0.x'
dotnet-version: '8.0.x'
- name: Build
run: dotnet build --configuration Release /p:Version=${VERSION}
working-directory: src
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: '6.0.x'
dotnet-version: '8.0.x'
- name: Build
run: dotnet build --configuration Release /p:Version=${VERSION}
working-directory: src
Expand Down
8 changes: 5 additions & 3 deletions src/PluginMerge/Compile/CompileHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ public async Task Run()
}

string code = await File.ReadAllTextAsync(_fileName).ConfigureAwait(false);
SyntaxTree tree = CSharpSyntaxTree.ParseText(code, new CSharpParseOptions(_config.PlatformSettings.Lang));
CSharpParseOptions parse = new(_config.PlatformSettings.Lang, preprocessorSymbols: _config.PreprocessorDirectives.EnabledDirectives.Select(d => d.Directive));
SyntaxTree tree = CSharpSyntaxTree.ParseText(code, parse);

FileScanner scanner = new(_compile.AssemblyPaths, "*.dll", _compile.IgnorePaths, _compile.IgnoreFiles);

Expand All @@ -44,8 +45,9 @@ public async Task Run()
}

await using MemoryStream stream = new();

CSharpCompilation compilation = CSharpCompilation.Create("output.dll", new List<SyntaxTree> {tree}, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

CSharpCompilationOptions options = new(OutputKind.DynamicallyLinkedLibrary);
CSharpCompilation compilation = CSharpCompilation.Create("output.dll", new List<SyntaxTree> {tree}, references, options);
EmitResult results = compilation.Emit(stream);
foreach (Diagnostic diagnostic in results.Diagnostics.Where(r => r.Severity >= _compile.CompileLogLevel).OrderBy(r => (int)r.Severity))
{
Expand Down
5 changes: 5 additions & 0 deletions src/PluginMerge/Configuration/MergeConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ public class MergeConfig
[JsonPropertyName("Reference Definitions")]
public List<string> References { get; set; }

[YamlMember(Alias = "Requires Definitions", Description = "Oxide //Requires: definitions")]
[JsonPropertyName("Requires Definitions")]
public List<string> Requires { get; set; }

[JsonPropertyName("Define Definitions")]
[YamlMember(Alias = "Define Definitions", Description = "#define definitions")]
public List<string> Defines { get; set; }
Expand Down Expand Up @@ -64,6 +68,7 @@ public void Initialize()
OutputPaths ??= new List<string> {"./build"};
Defines ??= new List<string> { "DEBUG" };
References ??= new List<string>();
Requires ??= new List<string>();
IgnorePaths ??= new List<string>{"./IgnoreThisPath"};
IgnoreFiles ??= new List<string>{"./IgnoreThisFile.cs"};
IgnoreNameSpaces ??= new List<string> {"IgnoreThisNameSpace"};
Expand Down
6 changes: 6 additions & 0 deletions src/PluginMerge/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ public static class Definitions
public const string OrderFile = "//Define:FileOrder=";
}

public static class OxideDefinitions
{
public const string Reference = "//Reference: ";
public const string Requires = "//Requires: ";
}

/// <summary>
/// Regexs for the application
/// </summary>
Expand Down
37 changes: 27 additions & 10 deletions src/PluginMerge/Creator/FileCreator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ public bool Create()
FilterFiles(_plugin.PluginData);

_writer = new CodeWriter(_plugin.PluginData, _settings.Merge);


WriteRequires();
WriteReferences();
WriteRequiredPreprocessorDirectives();
WriteDefines();
Expand Down Expand Up @@ -156,11 +157,19 @@ private void WriteErrorPreprocessorMessages()
}

/// <summary>
/// writes usings to the code writer
/// writes oxide //References: to the code writer
/// </summary>
private void WriteReferences()
{
_writer.WriteReferences(_settings.Merge.References);
_writer.WriteReferences(_files.SelectMany(f => f.References).Concat(_settings.Merge.References).Distinct());
}

/// <summary>
/// writes oxide //Requires: to the code writer
/// </summary>
private void WriteRequires()
{
_writer.WriteRequires(_files.SelectMany(f => f.Requires).Concat(_settings.Merge.Requires).Distinct());
}

/// <summary>
Expand All @@ -185,14 +194,22 @@ private void WriteUsings()
.Select(f => f.TypeNamespace))
.ToList();

_writer.WriteUsings(_files
.SelectMany(f => f.UsingStatements)
.Distinct()
.Where(u => !_settings.Merge.IgnoreNameSpaces.Any(u.StartsWith) && !extensionNameSpaces.Contains(u)));
var uniqueUsings = _files
.SelectMany(f => f.UsingStatements.Select(u => new
{
File = f,
Using = u,
UsingText = u.ToString(),
UsingName = u.Name.ToString()
}))
.DistinctBy(u => u.UsingText)
.Where(u => !_settings.Merge.IgnoreNameSpaces.Any(u.UsingName.StartsWith) && !extensionNameSpaces.Contains(u.UsingText))
.OrderBy(u => u.UsingText)
.ToArray();

_writer.WriteUsings(_files
.SelectMany(f => f.UsingAliases)
.Distinct());
_writer.WriteUsings(uniqueUsings.Where(u => u.Using.Alias == null && u.Using.StaticKeyword == default).Select(u => u.UsingText));
_writer.WriteUsings(uniqueUsings.Where(u => u.Using.StaticKeyword != default).Select(u => u.UsingText));
_writer.WriteUsings(uniqueUsings.Where(u => u.Using.Alias is not null).Select(u => u.UsingText));

if (_extensionTypes.Count != 0)
{
Expand Down
37 changes: 20 additions & 17 deletions src/PluginMerge/Merge/FileHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,17 @@ public class FileHandler
/// <summary>
/// Using statements in the code file
/// </summary>
public List<string> UsingStatements { get; } = new();
public List<UsingDirectiveSyntax> UsingStatements { get; } = new();

/// <summary>
/// Using statements in the code file
/// //References: comments
/// </summary>
public List<string> References { get; } = new();

/// <summary>
/// //Requires: comments
/// </summary>
public List<string> UsingAliases { get; } = new();
public List<string> Requires { get; } = new();

/// <summary>
/// Using statements in the code file
Expand Down Expand Up @@ -103,7 +108,7 @@ private Task ProcessComments(CompilationUnitSyntax root)
{
if (trivia.IsKind(SyntaxKind.SingleLineCommentTrivia))
{
if (trivia.Token.Parent is not (NamespaceDeclarationSyntax or ClassDeclarationSyntax or AttributeListSyntax))
if (trivia.Token.Parent is not (BaseNamespaceDeclarationSyntax or ClassDeclarationSyntax or AttributeListSyntax or UsingDirectiveSyntax))
{
continue;
}
Expand All @@ -118,12 +123,17 @@ private Task ProcessComments(CompilationUnitSyntax root)
Settings |= FileSettings.Exclude;
return Task.CompletedTask;
}
else if (comment.Contains(Constants.Definitions.OrderFile))
else if (comment.Contains(Constants.Definitions.OrderFile) && int.TryParse(comment.Replace(Constants.Definitions.OrderFile, string.Empty), out int order))
{
if (int.TryParse(comment.Replace(Constants.Definitions.OrderFile, string.Empty), out int order))
{
Order = order;
}
Order = order;
}
else if (comment.StartsWith(Constants.OxideDefinitions.Reference, StringComparison.OrdinalIgnoreCase))
{
References.Add(comment[Constants.OxideDefinitions.Reference.Length..]);
}
else if (comment.StartsWith(Constants.OxideDefinitions.Requires, StringComparison.OrdinalIgnoreCase))
{
Requires.Add(comment[Constants.OxideDefinitions.Requires.Length..]);
}

ProcessFrameworkComments(comment);
Expand Down Expand Up @@ -168,14 +178,7 @@ private Task ProcessUsings(PlatformSettings settings, CompilationUnitSyntax root
string name = @using.Name.ToString();
if (!name.Equals(settings.Namespace))
{
if (@using.Alias is null)
{
UsingStatements.Add(name);
}
else
{
UsingAliases.Add($"{@using.Alias.ToString()} {name}");
}
UsingStatements.Add(@using);
}
}

Expand Down
14 changes: 7 additions & 7 deletions src/PluginMerge/PluginMerge.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<AnalysisLevel>latest</AnalysisLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Nullable>disable</Nullable>
<RollForward>LatestMajor</RollForward>
</PropertyGroup>
Expand All @@ -42,12 +42,12 @@

<ItemGroup>
<PackageReference Include="CommandLineParser" Version="2.9.1" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.4.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.4.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="6.0.0" />
<PackageReference Include="YamlDotNet" Version="12.3.1" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="5.0.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="10.0.1" />
<PackageReference Include="YamlDotNet" Version="16.3.0" />
</ItemGroup>

<ItemGroup>
Expand Down
8 changes: 1 addition & 7 deletions src/PluginMerge/Scanner/FileScanner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,7 @@ public FileScanner(List<string> inputPaths, string filter = "*", IEnumerable<str

public IEnumerable<ScannedFile> ScanFiles()
{
foreach (string path in _inputPaths.Select(p => p.ToFullPath()))
{
foreach (ScannedFile file in ScanPath(path))
{
yield return file;
}
}
return _inputPaths.Select(p => p.ToFullPath()).SelectMany(ScanPath);
}

private IEnumerable<ScannedFile> ScanPath(string dir)
Expand Down
20 changes: 17 additions & 3 deletions src/PluginMerge/Writer/CodeWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,21 @@ public void WriteReferences(IEnumerable<string> references)
{
foreach (string define in references.OrderBy(u => u))
{
_writer.Append("//Reference: ");
_writer.Append(Constants.OxideDefinitions.Reference);
_writer.Append(define);
_writer.AppendLine();
}
}

/// <summary>
/// Writes requires to the code
/// </summary>
/// <param name="requires"></param>
public void WriteRequires(IEnumerable<string> requires)
{
foreach (string define in requires.OrderBy(u => u))
{
_writer.Append(Constants.OxideDefinitions.Requires);
_writer.Append(define);
_writer.AppendLine();
}
Expand All @@ -89,10 +103,10 @@ public void WriteDefines(IEnumerable<string> defines)
public void WriteUsings(IEnumerable<string> usings)
{
bool didWrite = false;
foreach (string @using in usings.OrderBy(u => u))
foreach (string @using in usings)
{
didWrite = true;
WriteUsing(@using);
_writer.AppendLine(@using);
}

if (didWrite)
Expand Down