Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono-addins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez <llsan@microsoft.com>2020-09-24 17:27:59 +0300
committerLluis Sanchez <llsan@microsoft.com>2020-10-05 13:52:50 +0300
commit25dd732a586d090b9f75366115ae6a6463d1efcd (patch)
tree2ac62a826493804bd5d171ac24f048651122ea4c
parent218902105d9b9eb1e703cd5f3ef9974a2f8b703d (diff)
Fix several issues caused by assembly qualified names
In some cases we were using the assembly qualified name when the type name was expected. Fixed type name parsing to make it more robust.
-rw-r--r--Mono.Addins.CecilReflector/Mono.Addins.CecilReflector/Reflector.cs6
-rw-r--r--Mono.Addins/Mono.Addins.Database/AddinScanner.cs17
-rw-r--r--Mono.Addins/Mono.Addins.Database/AddinUpdateData.cs38
-rw-r--r--Mono.Addins/Mono.Addins.Database/DefaultAssemblyReflector.cs9
-rw-r--r--Mono.Addins/Mono.Addins.Database/IAssemblyReflector.cs14
-rw-r--r--Mono.Addins/Mono.Addins.Database/Util.cs27
-rw-r--r--Mono.Addins/Mono.Addins/RuntimeAddin.cs11
7 files changed, 93 insertions, 29 deletions
diff --git a/Mono.Addins.CecilReflector/Mono.Addins.CecilReflector/Reflector.cs b/Mono.Addins.CecilReflector/Mono.Addins.CecilReflector/Reflector.cs
index f079222..69a8448 100644
--- a/Mono.Addins.CecilReflector/Mono.Addins.CecilReflector/Reflector.cs
+++ b/Mono.Addins.CecilReflector/Mono.Addins.CecilReflector/Reflector.cs
@@ -358,6 +358,12 @@ namespace Mono.Addins.CecilReflector
adef.Dispose ();
}
+ public string GetAssemblyName (object assembly)
+ {
+ var adef = (AssemblyDefinition)assembly;
+ return adef.Name.Name;
+ }
+
bool FoundToNotReferenceMonoAddins (AssemblyNameReference aref)
{
// Quick check to find out if an assembly references Mono.Addins, based only on cached information.
diff --git a/Mono.Addins/Mono.Addins.Database/AddinScanner.cs b/Mono.Addins/Mono.Addins.Database/AddinScanner.cs
index 22c5cf9..ceb2423 100644
--- a/Mono.Addins/Mono.Addins.Database/AddinScanner.cs
+++ b/Mono.Addins/Mono.Addins.Database/AddinScanner.cs
@@ -815,7 +815,8 @@ namespace Mono.Addins.Database
elem.SetAttribute ("id", eatt.Id);
elem.SetAttribute ("type", typeQualifiedName);
} else {
- elem.SetAttribute ("id", typeQualifiedName);
+ elem.SetAttribute ("id", typeFullName);
+ elem.SetAttribute ("type", typeQualifiedName);
}
if (eatt.InsertAfter.Length > 0)
elem.SetAttribute ("insertafter", eatt.InsertAfter);
@@ -1071,8 +1072,20 @@ namespace Mono.Addins.Database
return sb.ToString ();
}
- object FindAddinType (IAssemblyReflector reflector, string typeName, ArrayList assemblies)
+ object FindAddinType (IAssemblyReflector reflector, string type, ArrayList assemblies)
{
+ if (!Util.TryParseTypeName (type, out var typeName, out var assemblyName))
+ return null;
+
+ if (!string.IsNullOrEmpty (assemblyName) && assemblyName != "Mono.Addins") {
+ // Look in the specified assembly
+ foreach (var a in assemblies) {
+ if (reflector.GetAssemblyName (a) == assemblyName)
+ return reflector.GetType (a, typeName);
+ }
+ return null;
+ }
+
// Look in the current assembly
object etype = reflector.GetType (coreAssemblies [reflector], typeName);
if (etype != null)
diff --git a/Mono.Addins/Mono.Addins.Database/AddinUpdateData.cs b/Mono.Addins/Mono.Addins.Database/AddinUpdateData.cs
index 93b8715..c0f4f99 100644
--- a/Mono.Addins/Mono.Addins.Database/AddinUpdateData.cs
+++ b/Mono.Addins/Mono.Addins.Database/AddinUpdateData.cs
@@ -126,20 +126,24 @@ namespace Mono.Addins.Database
foreach (ExtensionNodeType nt in ep.NodeSet.NodeTypes) {
if (nt.ObjectTypeName.Length > 0) {
- List<ExtensionPoint> list;
- if (!objectTypeExtensions.TryGetValue (nt.ObjectTypeName, out list)) {
- list = new List<ExtensionPoint> ();
- objectTypeExtensions [nt.ObjectTypeName] = list;
+ if (Util.TryParseTypeName (nt.ObjectTypeName, out var typeName, out var _)) {
+ List<ExtensionPoint> list;
+ if (!objectTypeExtensions.TryGetValue (typeName, out list)) {
+ list = new List<ExtensionPoint> ();
+ objectTypeExtensions [typeName] = list;
+ }
+ list.Add (ep);
}
- list.Add (ep);
}
if (nt.ExtensionAttributeTypeName.Length > 0) {
List<ExtensionNodeType> list;
- if (!customAttributeTypeExtensions.TryGetValue (nt.ExtensionAttributeTypeName, out list)) {
- list = new List<ExtensionNodeType> ();
- customAttributeTypeExtensions [nt.ExtensionAttributeTypeName] = list;
+ if (Util.TryParseTypeName (nt.ExtensionAttributeTypeName, out var tname, out _)) {
+ if (!customAttributeTypeExtensions.TryGetValue (tname, out list)) {
+ list = new List<ExtensionNodeType> ();
+ customAttributeTypeExtensions [tname] = list;
+ }
+ list.Add (nt);
}
- list.Add (nt);
}
}
}
@@ -150,13 +154,15 @@ namespace Mono.Addins.Database
string[] objectTypes = extension.Path.Substring (1).Split (',');
bool found = false;
foreach (string s in objectTypes) {
- List<ExtensionPoint> list;
- if (objectTypeExtensions.TryGetValue (s, out list)) {
- found = true;
- foreach (ExtensionPoint ep in list) {
- if (IsAddinCompatible (ep.ParentAddinDescription, description, module)) {
- extension.Path = ep.Path;
- RegisterExtension (description, module, ep.Path);
+ if (Util.TryParseTypeName (s, out var typeName, out var _)) {
+ List<ExtensionPoint> list;
+ if (objectTypeExtensions.TryGetValue (typeName, out list)) {
+ found = true;
+ foreach (ExtensionPoint ep in list) {
+ if (IsAddinCompatible (ep.ParentAddinDescription, description, module)) {
+ extension.Path = ep.Path;
+ RegisterExtension (description, module, ep.Path);
+ }
}
}
}
diff --git a/Mono.Addins/Mono.Addins.Database/DefaultAssemblyReflector.cs b/Mono.Addins/Mono.Addins.Database/DefaultAssemblyReflector.cs
index 960add6..e5ef84d 100644
--- a/Mono.Addins/Mono.Addins.Database/DefaultAssemblyReflector.cs
+++ b/Mono.Addins/Mono.Addins.Database/DefaultAssemblyReflector.cs
@@ -32,7 +32,7 @@ using System.Collections.Generic;
namespace Mono.Addins.Database
{
- class DefaultAssemblyReflector: IAssemblyReflector
+ class DefaultAssemblyReflector : IAssemblyReflector
{
public void Initialize (IAssemblyLocator locator)
{
@@ -47,7 +47,12 @@ namespace Mono.Addins.Database
{
}
- public string[] GetResourceNames (object asm)
+ public string GetAssemblyName (object asm)
+ {
+ return ((Assembly)asm).GetName().Name;
+ }
+
+ public string [] GetResourceNames (object asm)
{
return ((Assembly)asm).GetManifestResourceNames ();
}
diff --git a/Mono.Addins/Mono.Addins.Database/IAssemblyReflector.cs b/Mono.Addins/Mono.Addins.Database/IAssemblyReflector.cs
index e6d4dab..f31523b 100644
--- a/Mono.Addins/Mono.Addins.Database/IAssemblyReflector.cs
+++ b/Mono.Addins/Mono.Addins.Database/IAssemblyReflector.cs
@@ -29,6 +29,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
+using System.Reflection;
namespace Mono.Addins.Database
{
@@ -148,7 +149,18 @@ namespace Mono.Addins.Database
/// An assembly
/// </param>
IEnumerable GetAssemblyTypes (object asm);
-
+
+ /// <summary>
+ /// Gets the name of the assembly
+ /// </summary>
+ /// <returns>
+ /// The assembly name
+ /// </returns>
+ /// <param name='asm'>
+ /// An assembly
+ /// </param>
+ string GetAssemblyName (object asm);
+
/// <summary>
/// Gets all assembly references of an assembly
/// </summary>
diff --git a/Mono.Addins/Mono.Addins.Database/Util.cs b/Mono.Addins/Mono.Addins.Database/Util.cs
index a44a20f..04890cc 100644
--- a/Mono.Addins/Mono.Addins.Database/Util.cs
+++ b/Mono.Addins/Mono.Addins.Database/Util.cs
@@ -69,6 +69,33 @@ namespace Mono.Addins.Database
return monoVersion;
}
}
+
+ public static bool TryParseTypeName (string assemblyQualifiedName, out string typeName, out string assemblyName)
+ {
+ int bracketCount = 0;
+ for (int n = 0; n < assemblyQualifiedName.Length; n++) {
+ var c = assemblyQualifiedName [n];
+ if (c == ',') {
+ if (bracketCount == 0) {
+ typeName = assemblyQualifiedName.Substring (0, n).Trim ();
+ try {
+ assemblyName = new AssemblyName (assemblyQualifiedName.Substring (n + 1)).Name;
+ return typeName.Length > 0;
+ } catch {
+ typeName = null;
+ assemblyName = null;
+ return false;
+ }
+ }
+ } else if (c == '[' || c == '<' || c == '(')
+ bracketCount++;
+ else if (c == ']' || c == '>' || c == ')')
+ bracketCount--;
+ }
+ typeName = assemblyQualifiedName;
+ assemblyName = null;
+ return true;
+ }
public static void CheckWrittableFloder (string path)
{
diff --git a/Mono.Addins/Mono.Addins/RuntimeAddin.cs b/Mono.Addins/Mono.Addins/RuntimeAddin.cs
index 6246ee4..920e55f 100644
--- a/Mono.Addins/Mono.Addins/RuntimeAddin.cs
+++ b/Mono.Addins/Mono.Addins/RuntimeAddin.cs
@@ -40,6 +40,7 @@ using System.Globalization;
using Mono.Addins.Description;
using Mono.Addins.Localization;
using System.Linq;
+using Mono.Addins.Database;
namespace Mono.Addins
{
@@ -327,14 +328,8 @@ namespace Mono.Addins
var type = Type.GetType (typeName, false);
if (type == null) {
// decode the name if it's qualified
- var index = typeName.IndexOf(',');
- string assemblyName = "";
-
- if (index != -1) {
- assemblyName = index == -1 ? "" : typeName.Substring (index + 2, typeName.Length - index - 2);
- typeName = typeName.Substring (0, index);
- }
- type = GetType_Expensive (typeName, assemblyName);
+ if (Util.TryParseTypeName (typeName, out var t, out var assemblyName))
+ type = GetType_Expensive (t, assemblyName ?? "");
}
if (throwIfNotFound && type == null)