diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs
index 9583a06ac4..a1cd915acf 100644
--- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs
@@ -20,6 +20,9 @@ using System;
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
{
+ ///
+ /// Assembly info parameters model
+ ///
public class AssemblyInfo
{
public string Title { get; set; }
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs
index 8ca0b3069f..c8d256f75d 100644
--- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs
@@ -17,18 +17,53 @@
// DEALINGS IN THE SOFTWARE.
using System;
+using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Runtime.InteropServices;
using ICSharpCode.NRefactory.CSharp;
using Attribute = ICSharpCode.NRefactory.CSharp.Attribute;
using CSharpParser = ICSharpCode.NRefactory.CSharp.CSharpParser;
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
{
+ ///
+ /// Class for reading and writing assembly info file
+ ///
public class AssemblyInfoProvider
{
- public AssemblyInfo Read(Stream stream)
+ #region Constants
+
+ private const string Attribute = "Attribute";
+
+ private const string AssemblyTitle = "AssemblyTitle";
+ private const string AssemblyDescription = "AssemblyDescription";
+ private const string AssemblyCompany = "AssemblyCompany";
+ private const string AssemblyProduct = "AssemblyProduct";
+ private const string AssemblyCopyright = "AssemblyCopyright";
+ private const string AssemblyTrademark = "AssemblyTrademark";
+ private const string AssemblyDefaultAlias = "AssemblyDefaultAlias";
+ private const string AssemblyVersion = "AssemblyVersion";
+ private const string AssemblyFileVersion = "AssemblyFileVersion";
+ private const string AssemblyInformationalVersion = "AssemblyInformationalVersion";
+ private const string Guid = "Guid";
+ private const string NeutralResourcesLanguage = "NeutralResourcesLanguage";
+ private const string ComVisible = "ComVisible";
+ private const string ClsCompliant = "CLSCompliant";
+ private const string AssemblyFlags = "AssemblyFlags";
+
+ #endregion
+
+ public AssemblyInfo ReadAssemblyInfo(string assemblyInfoFileName)
+ {
+ using (var fileStream = new FileStream(assemblyInfoFileName, FileMode.Open, FileAccess.Read))
+ {
+ return ReadAssemblyInfo(fileStream);
+ }
+ }
+
+ public AssemblyInfo ReadAssemblyInfo(Stream stream)
{
var syntaxTree = ReadSyntaxTree(stream);
@@ -48,52 +83,65 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
switch (attributeType.Identifier)
{
- case "AssemblyTitle":
+ case AssemblyTitle:
+ case AssemblyTitle + Attribute:
assemblyInfo.Title = GetAttributeValue(attribute);
break;
- case "AssemblyDescription":
+ case AssemblyDescription:
+ case AssemblyDescription + Attribute:
assemblyInfo.Description = GetAttributeValue(attribute);
break;
- case "AssemblyConfigurtation":
- break;
- case "AssemblyCompany":
+ case AssemblyCompany:
+ case AssemblyCompany + Attribute:
assemblyInfo.Company = GetAttributeValue(attribute);
break;
- case "AssemblyProduct":
+ case AssemblyProduct:
+ case AssemblyProduct + Attribute:
assemblyInfo.Product = GetAttributeValue(attribute);
break;
- case "AssemblyCopyright":
+ case AssemblyCopyright:
+ case AssemblyCopyright + Attribute:
assemblyInfo.Copyright = GetAttributeValue(attribute);
break;
- case "AssemblyTrademark":
+ case AssemblyTrademark:
+ case AssemblyTrademark + Attribute:
assemblyInfo.Trademark = GetAttributeValue(attribute);
break;
- case "AssemblyDefaultAlias":
+ case AssemblyDefaultAlias:
+ case AssemblyDefaultAlias + Attribute:
assemblyInfo.DefaultAlias = GetAttributeValue(attribute);
break;
- case "AssemblyVersion":
+ case AssemblyVersion:
+ case AssemblyVersion + Attribute:
assemblyInfo.AssemblyVersion = GetAttributeValueAsVersion(attribute);
break;
- case "AssemblyFileVersion":
+ case AssemblyFileVersion:
+ case AssemblyFileVersion + Attribute:
assemblyInfo.AssemblyFileVersion = GetAttributeValueAsVersion(attribute);
break;
- case "AssemblyInformationalVersion":
+ case AssemblyInformationalVersion:
+ case AssemblyInformationalVersion + Attribute:
assemblyInfo.InformationalVersion = GetAttributeValueAsVersion(attribute);
break;
- case "Guid":
+ case Guid:
+ case Guid + Attribute:
assemblyInfo.Guid = GetAttributeValueAsGuid(attribute);
break;
- case "NeutralResourcesLanguage":
+ case NeutralResourcesLanguage:
+ case NeutralResourcesLanguage + Attribute:
assemblyInfo.NeutralLanguage = GetAttributeValue(attribute);
break;
- case "ComVisible":
+ case ComVisible:
+ case ComVisible + Attribute:
assemblyInfo.ComVisible = GetAttributeValue(attribute);
break;
- case "CLSCompliant":
+ case ClsCompliant:
+ case ClsCompliant + Attribute:
assemblyInfo.ClsCompliant = GetAttributeValue(attribute);
break;
- case "AssemblyFlags":
- var assemblyFlags = (AssemblyNameFlags)GetAttributeValue(attribute, (int)AssemblyNameFlags.PublicKey);
+ case AssemblyFlags:
+ case AssemblyFlags + Attribute:
+ var assemblyFlags = GetAssemblyFlagsFromAttribute(attribute);
assemblyInfo.JitOptimization = !assemblyFlags.HasFlag(AssemblyNameFlags.EnableJITcompileOptimizer);
assemblyInfo.JitTracking = assemblyFlags.HasFlag(AssemblyNameFlags.EnableJITcompileTracking);
break;
@@ -104,32 +152,40 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
return assemblyInfo;
}
- public void Write(AssemblyInfo assemblyInfo, string fileName)
+ public void MergeAssemblyInfo(AssemblyInfo assemblyInfo, string fileName)
{
- SyntaxTree syntaxTree;
+ var content = string.Empty;
using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
- syntaxTree = ReadSyntaxTree(fileStream);
+ content = MergeAssemblyInfo(assemblyInfo, fileStream);
}
+ if (!string.IsNullOrEmpty(content))
+ File.WriteAllText(fileName, content);
+ }
+
+ public string MergeAssemblyInfo(AssemblyInfo assemblyInfo, Stream inputStream)
+ {
+ var syntaxTree = ReadSyntaxTree(inputStream);
+
if (syntaxTree == null)
throw new Exception("Can't read assembly info syntax tree.");
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyTitle", assemblyInfo.Title);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyDescription", assemblyInfo.Description);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyCompany", assemblyInfo.Company);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyProduct", assemblyInfo.Product);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyCopyright", assemblyInfo.Copyright);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyTrademark", assemblyInfo.Trademark);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyDefaultAlias", assemblyInfo.DefaultAlias);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyVersion", assemblyInfo.AssemblyVersion, null, true);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyFileVersion", assemblyInfo.AssemblyFileVersion, null, true);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyInformationalVersion", assemblyInfo.InformationalVersion, null, true);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "Guid", assemblyInfo.Guid, null, true);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "NeutralResourcesLanguage", assemblyInfo.NeutralLanguage);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "ComVisible", assemblyInfo.ComVisible, false);
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "CLSCompliant", assemblyInfo.ClsCompliant, false);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyTitle, assemblyInfo.Title);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyDescription, assemblyInfo.Description);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyCompany, assemblyInfo.Company);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyProduct, assemblyInfo.Product);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyCopyright, assemblyInfo.Copyright);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyTrademark, assemblyInfo.Trademark);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyDefaultAlias, assemblyInfo.DefaultAlias);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyVersion, assemblyInfo.AssemblyVersion, null, true);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyFileVersion, assemblyInfo.AssemblyFileVersion, null, true);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyInformationalVersion, assemblyInfo.InformationalVersion, null, true);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, Guid, assemblyInfo.Guid, null, true);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, NeutralResourcesLanguage, assemblyInfo.NeutralLanguage);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, ComVisible, assemblyInfo.ComVisible, false);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, ClsCompliant, assemblyInfo.ClsCompliant, false);
AssemblyNameFlags assemblyFlags = AssemblyNameFlags.PublicKey;
if (!assemblyInfo.JitOptimization)
@@ -137,12 +193,9 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
if (assemblyInfo.JitTracking)
assemblyFlags = assemblyFlags | AssemblyNameFlags.EnableJITcompileTracking;
- SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyFlags", (int)assemblyFlags, (int)AssemblyNameFlags.PublicKey);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyFlags, (int)assemblyFlags, (int)AssemblyNameFlags.PublicKey);
- using (var fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
- {
- WriteSyntaxTree(syntaxTree, fileStream);
- }
+ return syntaxTree.ToString();
}
private SyntaxTree ReadSyntaxTree(Stream stream)
@@ -155,17 +208,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
}
}
- private void WriteSyntaxTree(SyntaxTree syntaxTree, Stream stream)
- {
- var content = syntaxTree.ToString();
-
- using (var streamWriter = new StreamWriter(stream))
- {
- streamWriter.Write(content);
- streamWriter.Flush();
- }
- }
-
private T GetAttributeValue(Attribute attribute, T defaultValue = default(T))
{
var attributeArguments = attribute.Arguments.OfType().ToArray();
@@ -184,7 +226,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
if (!string.IsNullOrEmpty(guidString))
{
Guid guid;
- if (Guid.TryParse(guidString, out guid))
+ if (System.Guid.TryParse(guidString, out guid))
{
return guid;
}
@@ -211,7 +253,75 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
return null;
}
- private void SetAttributeValueOrAddAttributeIfNotDefault(SyntaxTree syntaxTree, string attributeName, object value, object defaultValue = null, bool transformValueToString = false)
+ private AssemblyNameFlags GetAssemblyFlagsFromAttribute(Attribute attribute)
+ {
+ if (attribute.Arguments.Count == 1)
+ return GetAssemblyFlagsFromExpression(attribute.Arguments.ElementAt(0));
+
+ return AssemblyNameFlags.PublicKey;
+ }
+
+ private AssemblyNameFlags GetAssemblyFlagsFromExpression(Expression expression)
+ {
+ if (expression == null)
+ return AssemblyNameFlags.PublicKey;
+
+ var primitiveExpression = expression as PrimitiveExpression;
+ if (primitiveExpression != null && primitiveExpression.Value is int)
+ return (AssemblyNameFlags)(int)primitiveExpression.Value;
+
+ var memberReferenceExpression = expression as MemberReferenceExpression;
+ if (memberReferenceExpression != null)
+ {
+ AssemblyNameFlags assemblyFlags;
+ if (Enum.TryParse(memberReferenceExpression.MemberName, out assemblyFlags))
+ {
+ return assemblyFlags;
+ }
+ }
+
+ var binaryExpression = expression as BinaryOperatorExpression;
+ if (binaryExpression != null && binaryExpression.Operator == BinaryOperatorType.BitwiseOr)
+ return GetAssemblyFlagsFromExpression(binaryExpression.Left) |
+ GetAssemblyFlagsFromExpression(binaryExpression.Right);
+
+ return AssemblyNameFlags.PublicKey;
+ }
+
+ //private Expression GetAssemblyFlagsExpression(AssemblyNameFlags assemblyFlags)
+ //{
+ // var flagNames = new List();
+ // var flagValues = Enum.
+
+ // assemblyFlags.h
+ //}
+
+ private void SetAttributeValueOrAddAttributeIfNotDefault(
+ SyntaxTree syntaxTree,
+ string attributeName,
+ object value,
+ object defaultValue = null,
+ bool transformValueToString = false)
+ {
+ if (value == null)
+ return;
+
+ var attributeValue = transformValueToString ? value.ToString() : value;
+
+ SetAttributeValueOrAddAttributeIfNotDefault(
+ syntaxTree,
+ attributeName,
+ value,
+ defaultValue,
+ new PrimitiveExpression(attributeValue));
+ }
+
+ private void SetAttributeValueOrAddAttributeIfNotDefault(
+ SyntaxTree syntaxTree,
+ string attributeName,
+ object value,
+ object defaultValue,
+ Expression valueExpression)
{
if (value == null)
return;
@@ -219,17 +329,15 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
var attribute = syntaxTree.Children.OfType().SelectMany(x => x.Attributes)
.FirstOrDefault(x => x.Type is SimpleType && ((SimpleType)x.Type).Identifier == attributeName);
- var attributeValue = transformValueToString ? value.ToString() : value;
-
if (attribute != null)
{
attribute.Arguments.Clear();
- attribute.Arguments.Add(new PrimitiveExpression(attributeValue));
+ attribute.Arguments.Add(valueExpression);
}
- else if (value != null && !value.Equals(defaultValue))
+ else if (!value.Equals(defaultValue))
{
- attribute = new Attribute() { Type = new SimpleType(attributeName) };
- attribute.Arguments.Add(new PrimitiveExpression(attributeValue));
+ attribute = new Attribute { Type = new SimpleType(attributeName) };
+ attribute.Arguments.Add(valueExpression);
var attributeSection = new AttributeSection(attribute) { AttributeTarget = "assembly" };
syntaxTree.AddChild(attributeSection, new NRefactory.Role("Member"));
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoViewModel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoViewModel.cs
index 4506a53d74..fbd3d26862 100644
--- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoViewModel.cs
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoViewModel.cs
@@ -1,3 +1,21 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -8,6 +26,9 @@ using ICSharpCode.SharpDevelop.Widgets;
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
{
+ ///
+ /// View model for assembly info
+ ///
public class AssemblyInfoViewModel : ViewModelBase
{
private const string NONE_LANGUAGE_CODE = "NONE";
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/VersionToStringConverter.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/VersionToStringConverter.cs
index 91bb4e5f58..153bebf4fe 100644
--- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/VersionToStringConverter.cs
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/VersionToStringConverter.cs
@@ -1,3 +1,21 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
using System;
using System.Windows;
using System.Windows.Data;
diff --git a/src/Main/Base/Test/ProjectOptions/AssemblyInfoProviderTests.cs b/src/Main/Base/Test/ProjectOptions/AssemblyInfoProviderTests.cs
index 6ea68e7afe..5813f66f67 100644
--- a/src/Main/Base/Test/ProjectOptions/AssemblyInfoProviderTests.cs
+++ b/src/Main/Base/Test/ProjectOptions/AssemblyInfoProviderTests.cs
@@ -24,38 +24,13 @@ using System;
namespace ICSharpCode.SharpDevelop.ProjectOptions
{
+ ///
+ /// Tests for assembly info reading and writing
+ ///
[TestFixture]
public class AssemblyInfoProviderTests
{
- [TestCase]
- public void ReadEmptyAssemblyInfoTest()
- {
- var assemblyInfoFile = string.Empty;
-
- var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
-
- Assert.IsNull(assemblyInfo.Title);
- Assert.IsNull(assemblyInfo.Description);
- Assert.IsNull(assemblyInfo.Company);
- Assert.IsNull(assemblyInfo.Product);
- Assert.IsNull(assemblyInfo.Copyright);
- Assert.IsNull(assemblyInfo.Trademark);
- Assert.IsNull(assemblyInfo.DefaultAlias);
- Assert.IsNull(assemblyInfo.AssemblyVersion);
- Assert.IsNull(assemblyInfo.AssemblyFileVersion);
- Assert.IsNull(assemblyInfo.InformationalVersion);
- Assert.IsNull(assemblyInfo.Guid);
- Assert.IsNull(assemblyInfo.NeutralLanguage);
- Assert.IsFalse(assemblyInfo.ComVisible);
- Assert.IsFalse(assemblyInfo.ClsCompliant);
- Assert.IsTrue(assemblyInfo.JitOptimization);
- Assert.IsFalse(assemblyInfo.JitTracking);
- }
-
- [TestCase]
- public void ReadNotEmptyAssemblyInfoTest()
- {
- var assemblyInfoFile =
+ private const string AssemblyInfoSample1 =
@"using System;
using System.Reflection;
using System.Runtime.InteropServices;
@@ -70,7 +45,6 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright (""Copyright 2014"")]
[assembly: AssemblyTrademark (""Trademark"")]
[assembly: AssemblyDefaultAlias (""Alias"")]
-
// This sets the default COM visibility of types in the assembly to invisible.
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
[assembly: ComVisible (true)]
@@ -88,6 +62,36 @@ using System.Runtime.InteropServices;
[assembly: AssemblyFlags (32769)]
[assembly: CLSCompliant (true)]";
+ [TestCase]
+ public void ReadEmptyAssemblyInfoTest()
+ {
+ var assemblyInfoFile = string.Empty;
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.IsNull(assemblyInfo.Title);
+ Assert.IsNull(assemblyInfo.Description);
+ Assert.IsNull(assemblyInfo.Company);
+ Assert.IsNull(assemblyInfo.Product);
+ Assert.IsNull(assemblyInfo.Copyright);
+ Assert.IsNull(assemblyInfo.Trademark);
+ Assert.IsNull(assemblyInfo.DefaultAlias);
+ Assert.IsNull(assemblyInfo.AssemblyVersion);
+ Assert.IsNull(assemblyInfo.AssemblyFileVersion);
+ Assert.IsNull(assemblyInfo.InformationalVersion);
+ Assert.IsNull(assemblyInfo.Guid);
+ Assert.IsNull(assemblyInfo.NeutralLanguage);
+ Assert.IsFalse(assemblyInfo.ComVisible);
+ Assert.IsFalse(assemblyInfo.ClsCompliant);
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+ }
+
+ [TestCase]
+ public void ReadNotEmptyAssemblyInfoTest()
+ {
+ var assemblyInfoFile = AssemblyInfoSample1;
+
var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
Assert.AreEqual("SharpDevelop", assemblyInfo.Title);
@@ -241,13 +245,236 @@ using System.Runtime.InteropServices;
Assert.IsTrue(assemblyInfo.ClsCompliant);
}
+ [TestCase]
+ public void ReadAssemblyInfoWithAttributePostfixTest()
+ {
+ var assemblyInfoFile =
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitleAttribute (""SharpDevelop"")]
+[assembly: AssemblyDescriptionAttribute (""OpenSource IDE"")]
+[assembly: AssemblyCompanyAttribute (""Company"")]
+[assembly: AssemblyProductAttribute (""Product"")]
+[assembly: AssemblyCopyrightAttribute (""Copyright 2014"")]
+[assembly: AssemblyTrademarkAttribute (""Trademark"")]
+[assembly: AssemblyDefaultAliasAttribute (""Alias"")]
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisibleAttribute (true)]
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersionAttribute (""1.2.3.1"")]
+[assembly: AssemblyFileVersionAttribute (""1.2.3.2"")]
+[assembly: AssemblyInformationalVersionAttribute (""1.2.3.3"")]
+[assembly: GuidAttribute (""0c8c889f-ced2-4167-b155-2d48a99d8c72"")]
+[assembly: NeutralResourcesLanguageAttribute (""ru-RU"")]
+[assembly: AssemblyFlagsAttribute (32769)]
+[assembly: CLSCompliantAttribute (true)]";
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.AreEqual("SharpDevelop", assemblyInfo.Title);
+ Assert.AreEqual("OpenSource IDE", assemblyInfo.Description);
+ Assert.AreEqual("Company", assemblyInfo.Company);
+ Assert.AreEqual("Product", assemblyInfo.Product);
+ Assert.AreEqual("Copyright 2014", assemblyInfo.Copyright);
+ Assert.AreEqual("Trademark", assemblyInfo.Trademark);
+ Assert.AreEqual("Alias", assemblyInfo.DefaultAlias);
+ Assert.AreEqual(new Version(1, 2, 3, 1), assemblyInfo.AssemblyVersion);
+ Assert.AreEqual(new Version(1, 2, 3, 2), assemblyInfo.AssemblyFileVersion);
+ Assert.AreEqual(new Version(1, 2, 3, 3), assemblyInfo.InformationalVersion);
+ Assert.AreEqual(new Guid("0c8c889f-ced2-4167-b155-2d48a99d8c72"), assemblyInfo.Guid);
+ Assert.AreEqual("ru-RU", assemblyInfo.NeutralLanguage);
+ Assert.IsTrue(assemblyInfo.ComVisible);
+ Assert.IsTrue(assemblyInfo.ClsCompliant);
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+ }
+
+ [TestCase]
+ public void ReadAssemblyInfoFlagsTests()
+ {
+ var assemblyInfo = ReadAssemblyInfo("[assembly: AssemblyFlags (32769)]");
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo("[assembly: AssemblyFlags (16385)]");
+ Assert.IsFalse(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo("[assembly: AssemblyFlags (49153)]");
+ Assert.IsFalse(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo("[assembly: AssemblyFlags (0)]");
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo(
+ "[assembly: AssemblyFlags(AssemblyNameFlags.EnableJITcompileTracking)]");
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo(
+ "[assembly: AssemblyFlags(AssemblyNameFlags.EnableJITcompileOptimizer)]");
+ Assert.IsFalse(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo(
+ "[assembly: AssemblyFlags()]");
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo(
+ "[assembly: AssemblyFlags(AssemblyNameFlags.EnableJITcompileOptimizer | AssemblyNameFlags.EnableJITcompileTracking)]");
+ Assert.IsFalse(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+ }
+
+ [TestCase]
+ public void WriteDefaultAssemblyInfoToEmptyAssemblyInfoFileTest()
+ {
+ var assemblyInfoFile = "using System.Reflection;";
+ var assemblyInfo = new AssemblyInfo { JitOptimization = true };
+ var result = WriteAssemblyInfoFile(assemblyInfo, assemblyInfoFile);
+
+ Assert.AreEqual("using System.Reflection;\r\n\r\n", result);
+ }
+
+ [TestCase]
+ public void WriteNotDefaultAssemblyInfoToEmptyAssemblyInfoFileTest()
+ {
+ var assemblyInfoFile = "using System.Reflection;";
+
+ var assemblyInfo = new AssemblyInfo
+ {
+ Title = "SharpDevelop",
+ Description = "OpenSource IDE",
+ Company = "Company",
+ Product = "Product",
+ Copyright = "Copyright 2014",
+ Trademark = "Trademark",
+ DefaultAlias = "Alias",
+ AssemblyVersion = new Version(1, 2, 3, 4),
+ AssemblyFileVersion = new Version(1, 2, 3, 4),
+ InformationalVersion = new Version(1, 2, 3, 4),
+ Guid = new Guid("0c8c889f-ced2-4167-b155-2d48a99d8c72"),
+ NeutralLanguage = "ru-RU",
+ ComVisible = true,
+ ClsCompliant = true,
+ JitOptimization = true,
+ JitTracking = true
+ };
+
+ var result = WriteAssemblyInfoFile(assemblyInfo, assemblyInfoFile);
+
+ Assert.AreEqual(
+@"using System.Reflection;
+
+[assembly: AssemblyTitle (""SharpDevelop"")]
+[assembly: AssemblyDescription (""OpenSource IDE"")]
+[assembly: AssemblyCompany (""Company"")]
+[assembly: AssemblyProduct (""Product"")]
+[assembly: AssemblyCopyright (""Copyright 2014"")]
+[assembly: AssemblyTrademark (""Trademark"")]
+[assembly: AssemblyDefaultAlias (""Alias"")]
+[assembly: AssemblyVersion (""1.2.3.4"")]
+[assembly: AssemblyFileVersion (""1.2.3.4"")]
+[assembly: AssemblyInformationalVersion (""1.2.3.4"")]
+[assembly: Guid (""0c8c889f-ced2-4167-b155-2d48a99d8c72"")]
+[assembly: NeutralResourcesLanguage (""ru-RU"")]
+[assembly: ComVisible (true)]
+[assembly: CLSCompliant (true)]
+[assembly: AssemblyFlags (32769)]
+", result);
+ }
+
+ [TestCase]
+ public void WriteNotDefaultAssemblyInfoToNotEmptyAssemblyInfoFileTest()
+ {
+ var assemblyInfoFile = AssemblyInfoSample1;
+
+ var assemblyInfo = new AssemblyInfo
+ {
+ Title = "SharpDevelop-changed",
+ Description = "OpenSource IDE-changed",
+ Company = "Company-changed",
+ Product = "Product-changed",
+ Copyright = "Copyright 2014-changed",
+ Trademark = "Trademark-changed",
+ DefaultAlias = "Alias-changed",
+ AssemblyVersion = new Version(4, 3, 2, 1),
+ AssemblyFileVersion = new Version(4, 3, 2, 1),
+ InformationalVersion = new Version(4, 3, 2, 1),
+ Guid = new Guid("dc8c889f-ced2-4167-b155-2d48a99d8c72"),
+ NeutralLanguage = "en-US",
+ ComVisible = false,
+ ClsCompliant = false,
+ JitOptimization = false,
+ JitTracking = false
+ };
+
+ var result = WriteAssemblyInfoFile(assemblyInfo, assemblyInfoFile);
+
+ Assert.AreEqual(
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle (""SharpDevelop-changed"")]
+[assembly: AssemblyDescription (""OpenSource IDE-changed"")]
+[assembly: AssemblyCompany (""Company-changed"")]
+[assembly: AssemblyProduct (""Product-changed"")]
+[assembly: AssemblyCopyright (""Copyright 2014-changed"")]
+[assembly: AssemblyTrademark (""Trademark-changed"")]
+[assembly: AssemblyDefaultAlias (""Alias-changed"")]
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible (false)]
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersion (""4.3.2.1"")]
+[assembly: AssemblyFileVersion (""4.3.2.1"")]
+[assembly: AssemblyInformationalVersion (""4.3.2.1"")]
+[assembly: Guid (""dc8c889f-ced2-4167-b155-2d48a99d8c72"")]
+[assembly: NeutralResourcesLanguage (""en-US"")]
+[assembly: AssemblyFlags (16385)]
+[assembly: CLSCompliant (false)]
+", result);
+ }
private AssemblyInfo ReadAssemblyInfo(string assemblyInfoFile)
{
- var stream = new MemoryStream(Encoding.UTF8.GetBytes(assemblyInfoFile));
- var assemblyInfoProvider = new AssemblyInfoProvider();
- var assemblyInfo = assemblyInfoProvider.Read(stream);
- return assemblyInfo;
+ using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(assemblyInfoFile)))
+ {
+ var assemblyInfoProvider = new AssemblyInfoProvider();
+ return assemblyInfoProvider.ReadAssemblyInfo(stream);
+ }
+ }
+
+ private string WriteAssemblyInfoFile(AssemblyInfo assemblyInfo, string sourceFile)
+ {
+ using (var inputStream = new MemoryStream(Encoding.UTF8.GetBytes(sourceFile)))
+ {
+ var assemblyInfoProvider = new AssemblyInfoProvider();
+ return assemblyInfoProvider.MergeAssemblyInfo(assemblyInfo, inputStream);
+ }
}
}
}