diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs
index b002d081d1..8efce50969 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs
@@ -151,6 +151,7 @@ namespace ICSharpCode.Core
builder.Append("delegate");
break;
case ClassType.Class:
+ case ClassType.Module:
builder.Append("class");
break;
case ClassType.Struct:
diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/MyNamespaceBuilder.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/MyNamespaceBuilder.cs
new file mode 100644
index 0000000000..32b42adb4d
--- /dev/null
+++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/MyNamespaceBuilder.cs
@@ -0,0 +1,74 @@
+/*
+ * Created by SharpDevelop.
+ * User: Daniel Grunwald
+ * Date: 19.07.2005
+ * Time: 18:01
+ */
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.Core;
+using ICSharpCode.SharpDevelop;
+using ICSharpCode.SharpDevelop.Dom;
+using ICSharpCode.SharpDevelop.Project;
+
+namespace VBNetBinding
+{
+ public static class MyNamespaceBuilder
+ {
+ public static void BuildNamespace(IProject project, IProjectContent pc)
+ {
+ ICompilationUnit cu = new DefaultCompilationUnit(pc);
+ const string ns = "My";
+ IClass myApp = CreateMyApplication(cu, project, ns);
+ IClass myComp = CreateMyComputer(cu, project, ns);
+ cu.Classes.Add(myApp);
+ cu.Classes.Add(myComp);
+ DefaultClass c = new DefaultClass(cu, ns + ".MyProject");
+ c.ClassType = ClassType.Module;
+ c.Modifiers = ModifierEnum.Internal | ModifierEnum.Partial | ModifierEnum.Sealed;
+ c.Properties.Add(new DefaultProperty("Application",
+ myApp.DefaultReturnType,
+ ModifierEnum.Internal | ModifierEnum.Static,
+ null, null, c));
+ c.Properties.Add(new DefaultProperty("Computer",
+ myComp.DefaultReturnType,
+ ModifierEnum.Internal | ModifierEnum.Static,
+ null, null, c));
+ c.Properties.Add(new DefaultProperty("User",
+ new GetClassReturnType(pc, "Microsoft.VisualBasic.ApplicationServices.User"),
+ ModifierEnum.Internal | ModifierEnum.Static,
+ null, null, c));
+ cu.Classes.Add(c);
+ pc.UpdateCompilationUnit(null, cu, "GeneratedMyNamespace.vb", false);
+ }
+
+ static IClass CreateMyApplication(ICompilationUnit cu, IProject project, string ns)
+ {
+ DefaultClass c = new DefaultClass(cu, ns + ".MyApplication");
+ c.ClassType = ClassType.Class;
+ c.Modifiers = ModifierEnum.Internal | ModifierEnum.Partial | ModifierEnum.Sealed;
+ switch (project.OutputType) {
+ case OutputType.WinExe:
+ c.BaseTypes.Add("Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase");
+ break;
+ case OutputType.Exe:
+ c.BaseTypes.Add("Microsoft.VisualBasic.ApplicationServices.ConsoleApplicationBase");
+ break;
+ default:
+ c.BaseTypes.Add("Microsoft.VisualBasic.ApplicationServices.ApplicationBase");
+ break;
+ }
+ return c;
+ }
+
+ static IClass CreateMyComputer(ICompilationUnit cu, IProject project, string ns)
+ {
+ DefaultClass c = new DefaultClass(cu, ns + ".MyComputer");
+ c.ClassType = ClassType.Class;
+ c.Modifiers = ModifierEnum.Internal | ModifierEnum.Partial | ModifierEnum.Sealed;
+ c.BaseTypes.Add("Microsoft.VisualBasic.Devices.Computer");
+ return c;
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs
index a4c8c3e7f9..9712a83c11 100644
--- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs
+++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs
@@ -239,6 +239,13 @@ namespace VBNetBinding
imports.Add(@"$(MSBuildBinPath)\Microsoft.VisualBasic.Targets");
}
+ public override ParseProjectContent CreateProjectContent()
+ {
+ ParseProjectContent pc = base.CreateProjectContent();
+ MyNamespaceBuilder.BuildNamespace(this, pc);
+ return pc;
+ }
+
void InitVB()
{
Language = "VBNet";
diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs
index 953ecf90bc..fc670acd09 100644
--- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs
+++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs
@@ -147,6 +147,9 @@ namespace VBNetBinding
case ClassType.Class:
builder.Append("Class");
break;
+ case ClassType.Module:
+ builder.Append("Module");
+ break;
case ClassType.Struct:
builder.Append("Structure");
break;
@@ -242,6 +245,9 @@ namespace VBNetBinding
case ClassType.Class:
builder.Append("Class");
break;
+ case ClassType.Module:
+ builder.Append("Module");
+ break;
case ClassType.Struct:
builder.Append("Structure");
break;
diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj
index 864c6bd96e..00d1ff068a 100644
--- a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj
+++ b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj
@@ -52,6 +52,7 @@
Always
+
diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/VBNetKeywordList.txt b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/KeywordList.txt
similarity index 100%
rename from src/Libraries/NRefactory/Project/Src/Lexer/VBNet/VBNetKeywordList.txt
rename to src/Libraries/NRefactory/Project/Src/Lexer/VBNet/KeywordList.txt
diff --git a/src/Main/Base/Project/Src/Dom/ClassType.cs b/src/Main/Base/Project/Src/Dom/ClassType.cs
index 27984010cf..ad93d6adbc 100644
--- a/src/Main/Base/Project/Src/Dom/ClassType.cs
+++ b/src/Main/Base/Project/Src/Dom/ClassType.cs
@@ -1,4 +1,4 @@
-//
+//
//
//
//
@@ -12,6 +12,7 @@ namespace ICSharpCode.SharpDevelop.Dom
Enum,
Interface,
Struct,
- Delegate
+ Delegate,
+ Module
}
}
diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
index 5f222af4fe..8f08ae040b 100644
--- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
+++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
@@ -288,6 +288,8 @@ namespace ICSharpCode.SharpDevelop.Dom
return ReflectionReturnType.Object.GetUnderlyingClass();
}
break;
+ case ClassType.Module:
+ return null;
case ClassType.Enum:
return ProjectContentRegistry.GetMscorlibContent().GetClass("System.Enum");
case ClassType.Delegate:
@@ -371,8 +373,7 @@ namespace ICSharpCode.SharpDevelop.Dom
bool isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(this);
foreach (IClass c in InnerClasses) {
- if (((c.ClassType == ClassType.Class) || (c.ClassType == ClassType.Struct)) &&
- c.IsAccessible(callingClass, isClassInInheritanceTree)) {
+ if (c.IsAccessible(callingClass, isClassInInheritanceTree)) {
types.Add(c);
}
}
diff --git a/src/Main/Base/Project/Src/Dom/LanguageProperties.cs b/src/Main/Base/Project/Src/Dom/LanguageProperties.cs
index 9d82f28fb8..2778d886c8 100644
--- a/src/Main/Base/Project/Src/Dom/LanguageProperties.cs
+++ b/src/Main/Base/Project/Src/Dom/LanguageProperties.cs
@@ -28,6 +28,12 @@ namespace ICSharpCode.SharpDevelop.Dom
return true;
}
}
+
+ public override bool ImportModules {
+ get {
+ return true;
+ }
+ }
public override string ToString()
{
@@ -57,6 +63,15 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
+ ///
+ /// Gets if modules are imported with their namespace (i.e. Microsoft.VisualBasic.Randomize()).
+ ///
+ public virtual bool ImportModules {
+ get {
+ return false;
+ }
+ }
+
public virtual bool ShowMember(IMember member, bool showStatic)
{
return member.IsStatic == showStatic;
diff --git a/src/Main/Base/Project/Src/Dom/ModifierEnum.cs b/src/Main/Base/Project/Src/Dom/ModifierEnum.cs
index 1412ed98ed..66c6f2b8e8 100644
--- a/src/Main/Base/Project/Src/Dom/ModifierEnum.cs
+++ b/src/Main/Base/Project/Src/Dom/ModifierEnum.cs
@@ -1,4 +1,4 @@
-//
+//
//
//
//
@@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Dom
Static = 0x0080,
Override = 0x0100,
Readonly = 0x0200,
- Const = 0X0400,
+ Const = 0x0400,
New = 0x0800,
// Special
@@ -39,6 +39,7 @@ namespace ICSharpCode.SharpDevelop.Dom
SpecialName = 0x20000,
Final = 0x40000,
+ Partial = 0x80000,
}
}
diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs
index da2181ab8b..214d6682fa 100644
--- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs
+++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs
@@ -242,9 +242,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return ClassType.Interface;
case AST.Types.Struct:
return ClassType.Struct;
+ case AST.Types.Module:
+ return ClassType.Module;
+ default:
+ return ClassType.Class;
}
- // Class and Module
- return ClassType.Class;
}
DefaultRegion GetRegion(Point start, Point end)
diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
index 3ff1adc2ca..9e12ba57f8 100644
--- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
+++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
@@ -252,21 +252,28 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
ResolveResult ResolveMemberReferenceExpression(IReturnType type, FieldReferenceExpression fieldReferenceExpression)
{
IClass c;
- string name = SearchNamespace(type.FullyQualifiedName, this.CompilationUnit);
- // TODO: Test directly for NamespaceReturnType
- if (name != null) {
- name += "." + fieldReferenceExpression.FieldName;
- string n = SearchNamespace(name, null);
- if (n != null) {
- return new NamespaceResolveResult(callingClass, callingMember, n);
- }
- c = SearchType(name, this.CallingClass, this.CompilationUnit);
+ IMember member;
+ TypeVisitor.NamespaceReturnType namespaceRT = type as TypeVisitor.NamespaceReturnType;
+ if (namespaceRT != null) {
+ string combinedName = namespaceRT.FullyQualifiedName + "." + fieldReferenceExpression.FieldName;
+ if (projectContent.NamespaceExists(combinedName)) {
+ return new NamespaceResolveResult(callingClass, callingMember, combinedName);
+ }
+ c = projectContent.GetClass(combinedName);
if (c != null) {
return new TypeResolveResult(callingClass, callingMember, c);
}
+ if (languageProperties.ImportModules) {
+ // go through the members of the modules
+ foreach (object o in projectContent.GetNamespaceContents(namespaceRT.FullyQualifiedName)) {
+ member = o as IMember;
+ if (member != null && IsSameName(member.Name, fieldReferenceExpression.FieldName))
+ return CreateMemberResolveResult(member);
+ }
+ }
return null;
}
- IMember member = GetMember(type, fieldReferenceExpression.FieldName);
+ member = GetMember(type, fieldReferenceExpression.FieldName);
if (member != null)
return CreateMemberResolveResult(member);
c = type.GetUnderlyingClass();
@@ -471,7 +478,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return null;
}
- bool IsSameName(string name1, string name2)
+ public bool IsSameName(string name1, string name2)
{
return languageProperties.NameComparer.Equals(name1, name2);
}
diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs
index 0ff73b0c06..b176203640 100644
--- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs
+++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs
@@ -227,16 +227,25 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
IReturnType returnType = fieldReferenceExpression.TargetObject.AcceptVisitor(this, data) as IReturnType;
if (returnType != null) {
- string name = resolver.SearchNamespace(returnType.FullyQualifiedName, resolver.CompilationUnit);
- if (name != null) {
- string n = resolver.SearchNamespace(name + "." + fieldReferenceExpression.FieldName, null);
- if (n != null) {
- return new NamespaceReturnType(n);
+ NamespaceReturnType namespaceRT = returnType as NamespaceReturnType;
+ if (namespaceRT != null) {
+ string name = namespaceRT.FullyQualifiedName;
+ string combinedName = name + "." + fieldReferenceExpression.FieldName;
+ if (resolver.ProjectContent.NamespaceExists(combinedName)) {
+ return new NamespaceReturnType(combinedName);
}
- IClass c = resolver.SearchType(name + "." + fieldReferenceExpression.FieldName, resolver.CallingClass, resolver.CompilationUnit);
+ IClass c = resolver.ProjectContent.GetClass(combinedName);
if (c != null) {
return c.DefaultReturnType;
}
+ if (resolver.LanguageProperties.ImportModules) {
+ // go through the members of the modules
+ foreach (object o in resolver.ProjectContent.GetNamespaceContents(name)) {
+ IMember member = o as IMember;
+ if (member != null && resolver.IsSameName(member.Name, fieldReferenceExpression.FieldName))
+ return member.ReturnType;
+ }
+ }
return null;
}
return resolver.SearchMember(returnType, fieldReferenceExpression.FieldName);
@@ -500,7 +509,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return t;
}
- class NamespaceReturnType : AbstractReturnType
+ public class NamespaceReturnType : AbstractReturnType
{
public NamespaceReturnType(string fullName)
{
diff --git a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
index ecb78acfe2..b652bb93ec 100644
--- a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
+++ b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
@@ -175,6 +175,7 @@ namespace ICSharpCode.SharpDevelop.Dom
} else if (IsDelegate(type)) {
this.ClassType = ClassType.Delegate;
} else {
+ // TODO: Check if class is a module.
this.ClassType = ClassType.Class;
}
if (type.IsGenericTypeDefinition) {
diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs
index a77c664ea0..8ec58d072a 100644
--- a/src/Main/Base/Project/Src/Project/AbstractProject.cs
+++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs
@@ -363,7 +363,14 @@ namespace ICSharpCode.SharpDevelop.Project
return null;
}
-
+ ///
+ /// Creates a new project content for this project.
+ /// This method should only be called by ParserService.LoadSolutionProjectsInternal()!
+ ///
+ public virtual ParseProjectContent CreateProjectContent()
+ {
+ return ParseProjectContent.CreateUninitalized(this);
+ }
///
/// Saves project preferences (currently opened files, bookmarks etc.) to the
diff --git a/src/Main/Base/Project/Src/Project/IProject.cs b/src/Main/Base/Project/Src/Project/IProject.cs
index 5c4556b1c6..039bd149fb 100644
--- a/src/Main/Base/Project/Src/Project/IProject.cs
+++ b/src/Main/Base/Project/Src/Project/IProject.cs
@@ -103,6 +103,12 @@ namespace ICSharpCode.SharpDevelop.Project
void Start(bool withDebugging);
+ ///
+ /// Creates a new project content for this project.
+ /// This method should only be called by ParserService.LoadSolutionProjectsInternal()!
+ ///
+ ParseProjectContent CreateProjectContent();
+
CompilerResults Build();
CompilerResults Rebuild();
CompilerResults Clean();
diff --git a/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs b/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs
index 14fa54a474..367187cc53 100644
--- a/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs
+++ b/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs
@@ -1,4 +1,4 @@
-//
+//
//
//
//
@@ -30,6 +30,9 @@ namespace ICSharpCode.Core
case ClassType.Class:
builder.Append("Class");
break;
+ case ClassType.Module:
+ builder.Append("Module");
+ break;
case ClassType.Struct:
builder.Append("Structure");
break;
diff --git a/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs
index 8a5bc4b99a..b99d0ce4b0 100644
--- a/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs
+++ b/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs
@@ -391,7 +391,19 @@ namespace ICSharpCode.Core
Dictionary dict = GetNamespaces(language);
if (dict.ContainsKey(nameSpace)) {
NamespaceStruct ns = dict[nameSpace];
- list.AddRange(ns.Classes);
+ int newCapacity = list.Count + ns.Classes.Count + ns.SubNamespaces.Count;
+ if (list.Capacity < newCapacity)
+ list.Capacity = newCapacity;
+ if (language.ImportModules) {
+ foreach (IClass c in ns.Classes) {
+ list.Add(c);
+ if (c.ClassType == ClassType.Module) {
+ list.AddRange(c.GetAccessibleMembers(null, true));
+ }
+ }
+ } else {
+ list.AddRange(ns.Classes);
+ }
foreach (string subns in ns.SubNamespaces) {
if (!list.Contains(subns))
list.Add(subns);
diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
index a0430767ec..eeefb1c568 100644
--- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
+++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
@@ -125,7 +125,7 @@ namespace ICSharpCode.Core
List createdContents = new List();
foreach (IProject project in ProjectService.OpenSolution.Projects) {
try {
- ParseProjectContent newContent = ParseProjectContent.CreateUninitalized(project);
+ ParseProjectContent newContent = project.CreateProjectContent();
lock (projectContents) {
projectContents[project] = newContent;
}