icsharpcode / nrefactory Goto Github PK
View Code? Open in Web Editor NEWNRefactory - Refactoring Your C# Code
NRefactory - Refactoring Your C# Code
Given this class:
public class IndexerTest
{
public string this[int index] { get { return "Test"; } set {} }
}
the following test will fail with the TypeSystemConvertVisitor (but not with the CecilLoader):
[Test]
public void IndexerParameters()
{
var testClass = GetTypeDefinition(typeof(IndexerTest));
IProperty p = testClass.Properties.Single(pr => pr.IsIndexer);
Assert.AreEqual("Item", p.Name);
Assert.AreEqual(new[] { "index" }, p.Getter.Parameters.Select(x => x.Name).ToArray());
Assert.AreEqual(new[] { "index", "value" }, p.Setter.Parameters.Select(x => x.Name).ToArray());
}
IEntity.IsStatic documentation says that:
/// <summary>
/// Gets whether this entity is static.
/// Returns true if either the 'static' or the 'const' modifier is set.
/// </summary>
But IField that is a const, returns IsStatic=false, and IsConst = true
The following test passes:
[Test]
public void ImplicitThisReferences() {
string program = @"
using System;
using System.Linq;
class Test {
int x;
public void Main (string[] args) {
$x$ = 1;
}
}";
var rr = Resolve<MemberResolveResult>(program);
Assert.That(rr.TargetResult is TypeResolveResult);
}
It's usable, but I think it would be more useful to have the TargetResult be a ThisRessolveResult instead because, after all, that's what the semantics of the expression is.
Hi, parser crashes on this code:
var x = new
{
storeId = "simpsonsStore",
fields = new[] { "name", "email", "phone" },
data = new
{
//items = new[]
//{
// new { name= "Lisa", email="[email protected]", phone="555-111-1224" },
// new { name= "Bart", email="[email protected]", phone="555-222-1234" },
// new { name= "Homer", email="[email protected]", phone="555-222-1244" },
// new { name= "Marge", email="[email protected]", phone="555-222-1254" }
//}
},
//proxy = new
//{
// type = "memory",
// reader = new
// {
// type = "json",
// root = "items"
// }
//}
};
Exception:
System.NotSupportedException occurred
Message=Specified method is not supported.
Source=ICSharpCode.NRefactory
StackTrace:
at ICSharpCode.NRefactory.TypeSystem.AnonymousType.ToTypeReference() in C:\Projects\SharpJs\lib\NRefactory\ICSharpCode.NRefactory\TypeSystem\AnonymousType.cs:line 76
InnerException:
A property OverriddenMember
would be a useful addition to the IMember interface.
What is the policy for the positioning of brackets?
It is kinda obvious who is using what as in, VS defaults to
void Name()
{
}
and MonoDev to
void Name() {
}
This also counts for the spaces before/after keyword/parameter/function/bracket etc...
Mono.Cecil.dll!Mono.Cecil.MetadataReader.GetModuleFileName(string name = "System.EnterpriseServices.Wrapper.dll") Line 569 + 0x19 bytes C#
Mono.Cecil.dll!Mono.Cecil.MetadataReader.ReadModules() Line 557 + 0x12 bytes C#
Mono.Cecil.dll!Mono.Cecil.AssemblyDefinition.get_Modules.AnonymousMethod__1(Mono.Cecil.AssemblyDefinition _ = {Mono.Cecil.AssemblyDefinition}, Mono.Cecil.MetadataReader reader = {Mono.Cecil.MetadataReader}) Line 65 + 0xb bytes C#
Mono.Cecil.dll!Mono.Cecil.ModuleDefinition.Read<Mono.Cecil.AssemblyDefinition,Mono.Collections.Generic.Collection<Mono.Cecil.ModuleDefinition>>(Mono.Cecil.AssemblyDefinition item = {Mono.Cecil.AssemblyDefinition}, System.Func<Mono.Cecil.AssemblyDefinition,Mono.Cecil.MetadataReader,Mono.Collections.Generic.Collection<Mono.Cecil.ModuleDefinition>> read = {Method = Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.}) Line 818 + 0x14 bytes C#
Mono.Cecil.dll!Mono.Cecil.AssemblyDefinition.Modules.get() Line 65 + 0x8a bytes C#
ICSharpCode.NRefactory.dll!ICSharpCode.NRefactory.TypeSystem.CecilLoader.LoadAssembly(Mono.Cecil.AssemblyDefinition assemblyDefinition = {Mono.Cecil.AssemblyDefinition}) Line 123 + 0xc bytes C#
ICSharpCode.NRefactory.dll!ICSharpCode.NRefactory.TypeSystem.CecilLoader.LoadAssemblyFile(string fileName = "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.EnterpriseServices.dll") Line 198 + 0xb bytes C#
SharpJs.exe!SharpKit.SkProject.LoadAssemblies.AnonymousMethod__0(int i = 10) Line 29 + 0x35 bytes C#
There are a handful of problems involving formatting of if else statements, primarily if the if section is wrapped in a block that causes parts of the else section to be incorporated into comments, usually causing compiler errors.
public class A : B
{
public void Test()
{
// Comment before
if (conditionA) {
DoSomething();
}
// Comment before else ends up incorporating it
else if (conditionB) {
DoSomethingElse();
}
}
}
Results in:
public class A : B
{
public void Test ()
{
// Comment before
if (conditionA) {
DoSomething ();
}
// Comment before else ends up incorporating it else if (conditionB) {
DoSomethingElse ();
}
}
}
When swapping the "else if" with just an "if" the following exception is thrown:
System.InvalidOperationException : Detected overlapping changes [TextReplaceAction: Offset=220, RemovalLength=1, >NewText=
]/[TextReplaceAction: Offset=220, RemovalLength=1, NewText=
]
Hi, do you have any plans to publish to NRefactory to NuGet? I've started using it for a new project I'm working on, which I would like to distribute through NuGet, and I'd love to be able to include this as a dependent NuGet package.
I can't seem to find a property on Conversion to determine if it is a null literal conversion. I therefore suggest adding
bool IsNullLiteralConversion { get; }
to ICSharpCode.NRefactory.Semantics.Conversion
I have several #region directives in my code, between members of my class and they arent generated... Looking in ICsharpCode, the CSharpOutputVisitor.VisitTypeDeclaration visits only the Members of the class...
Failing test:
[Test]
public void NestingAnonymousTypesShouldWork()
{
string program = @"using System;
class TestClass {
void F() {
var o = $new { a = 0, b = 1, c = new { d = 2, e = 3, f = 4 } }$;
}
}";
var result = Resolve<InvocationResolveResult>(program);
Assert.That(result.Type.GetProperties().Select(p => p.Name), Is.EquivalentTo(new[] { "a", "b", "c" }));
Assert.That(result.Type.GetProperties().Single(p => p.Name == "c").ReturnType.GetProperties().Select(p => p.Name), Is.EquivalentTo(new[] { "d", "e", "f" }));
}
These tests fail:
[Test]
public void IsLiftedProperty()
{
string program = @"
class Test {
static void Inc() {
int? a = 0, b = 0;
int? c = $a + b$;
}
}";
var irr = Resolve<OperatorResolveResult>(program);
Assert.IsFalse(irr.IsError);
Assert.IsTrue(irr.IsLiftedOperator);
}
[Test]
public void IsLiftedProperty2()
{
string program = @"
class Test {
static void Inc() {
int? a = 0, b = 0;
$b += a$;
}
}";
var irr = Resolve<OperatorResolveResult>(program);
Assert.IsFalse(irr.IsError);
Assert.IsTrue(irr.IsLiftedOperator);
}
When parsing the test file written below, getting an exception during parsing:
Exception:
System.NotImplementedException occurred
Message=The method or operation is not implemented.
Source=ICSharpCode.NRefactory.CSharp
StackTrace:
at Mono.CSharp.SeekableStreamReader.ReadChars(Int32 fromPosition, Int32 toPosition) in C:\Projects\SharpJs\lib\NRefactory\ICSharpCode.NRefactory.CSharp\Parser\mcs\support.cs:line 258
InnerException:
Method:
public char[] ReadChars (int fromPosition, int toPosition)
{
char[] chars = new char[toPosition - fromPosition];
if (buffer_start <= fromPosition && toPosition <= buffer_start + buffer.Length) {
Array.Copy (buffer, fromPosition - buffer_start, chars, 0, chars.Length);
} else {
throw new NotImplementedException ();
}
return chars;
}
Info:
fromPosition =137
toPosition =7150
buffer_start = 4096
buffer_start <= fromPosition : FALSE - causes the exception
Test file to parse:
using System;
namespace test
{
public class ParserBufferBug
{
static void foo()
{
var x = @"{
aliceblue: 'f0f8ff',
antiquewhite: 'faebd7',
aqua: '0ff',
aquamarine: '7fffd4',
azure: 'f0ffff',
beige: 'f5f5dc',
bisque: 'ffe4c4',
black: '000',
blanchedalmond: 'ffebcd',
blue: '00f',
blueviolet: '8a2be2',
brown: 'a52a2a',
burlywood: 'deb887',
burntsienna: 'ea7e5d',
cadetblue: '5f9ea0',
chartreuse: '7fff00',
chocolate: 'd2691e',
coral: 'ff7f50',
cornflowerblue: '6495ed',
cornsilk: 'fff8dc',
crimson: 'dc143c',
cyan: '0ff',
darkblue: '00008b',
darkcyan: '008b8b',
darkgoldenrod: 'b8860b',
darkgray: 'a9a9a9',
darkgreen: '006400',
darkgrey: 'a9a9a9',
darkkhaki: 'bdb76b',
darkmagenta: '8b008b',
darkolivegreen: '556b2f',
darkorange: 'ff8c00',
darkorchid: '9932cc',
darkred: '8b0000',
darksalmon: 'e9967a',
darkseagreen: '8fbc8f',
darkslateblue: '483d8b',
darkslategray: '2f4f4f',
darkslategrey: '2f4f4f',
darkturquoise: '00ced1',
darkviolet: '9400d3',
deeppink: 'ff1493',
deepskyblue: '00bfff',
dimgray: '696969',
dimgrey: '696969',
dodgerblue: '1e90ff',
firebrick: 'b22222',
floralwhite: 'fffaf0',
forestgreen: '228b22',
fuchsia: 'f0f',
gainsboro: 'dcdcdc',
ghostwhite: 'f8f8ff',
gold: 'ffd700',
goldenrod: 'daa520',
gray: '808080',
green: '008000',
greenyellow: 'adff2f',
grey: '808080',
honeydew: 'f0fff0',
hotpink: 'ff69b4',
indianred: 'cd5c5c',
indigo: '4b0082',
ivory: 'fffff0',
khaki: 'f0e68c',
lavender: 'e6e6fa',
lavenderblush: 'fff0f5',
lawngreen: '7cfc00',
lemonchiffon: 'fffacd',
lightblue: 'add8e6',
lightcoral: 'f08080',
lightcyan: 'e0ffff',
lightgoldenrodyellow: 'fafad2',
lightgray: 'd3d3d3',
lightgreen: '90ee90',
lightgrey: 'd3d3d3',
lightpink: 'ffb6c1',
lightsalmon: 'ffa07a',
lightseagreen: '20b2aa',
lightskyblue: '87cefa',
lightslategray: '789',
lightslategrey: '789',
lightsteelblue: 'b0c4de',
lightyellow: 'ffffe0',
lime: '0f0',
limegreen: '32cd32',
linen: 'faf0e6',
magenta: 'f0f',
maroon: '800000',
mediumaquamarine: '66cdaa',
mediumblue: '0000cd',
mediumorchid: 'ba55d3',
mediumpurple: '9370db',
mediumseagreen: '3cb371',
mediumslateblue: '7b68ee',
mediumspringgreen: '00fa9a',
mediumturquoise: '48d1cc',
mediumvioletred: 'c71585',
midnightblue: '191970',
mintcream: 'f5fffa',
mistyrose: 'ffe4e1',
moccasin: 'ffe4b5',
navajowhite: 'ffdead',
navy: '000080',
oldlace: 'fdf5e6',
olive: '808000',
olivedrab: '6b8e23',
orange: 'ffa500',
orangered: 'ff4500',
orchid: 'da70d6',
palegoldenrod: 'eee8aa',
palegreen: '98fb98',
paleturquoise: 'afeeee',
palevioletred: 'db7093',
papayawhip: 'ffefd5',
peachpuff: 'ffdab9',
peru: 'cd853f',
pink: 'ffc0cb',
plum: 'dda0dd',
powderblue: 'b0e0e6',
purple: '800080',
red: 'f00',
rosybrown: 'bc8f8f',
royalblue: '4169e1',
saddlebrown: '8b4513',
salmon: 'fa8072',
sandybrown: 'f4a460',
seagreen: '2e8b57',
seashell: 'fff5ee',
sienna: 'a0522d',
silver: 'c0c0c0',
skyblue: '87ceeb',
slateblue: '6a5acd',
slategray: '708090',
slategrey: '708090',
snow: 'fffafa',
springgreen: '00ff7f',
steelblue: '4682b4',
tan: 'd2b48c',
teal: '008080',
thistle: 'd8bfd8',
tomato: 'ff6347',
turquoise: '40e0d0',
violet: 'ee82ee',
wheat: 'f5deb3',
white: 'fff',
whitesmoke: 'f5f5f5',
yellow: 'ff0',
yellowgreen: '9acd32'
aliceblue: 'f0f8ff',
antiquewhite: 'faebd7',
aqua: '0ff',
aquamarine: '7fffd4',
azure: 'f0ffff',
beige: 'f5f5dc',
bisque: 'ffe4c4',
black: '000',
blanchedalmond: 'ffebcd',
blue: '00f',
blueviolet: '8a2be2',
brown: 'a52a2a',
burlywood: 'deb887',
burntsienna: 'ea7e5d',
cadetblue: '5f9ea0',
chartreuse: '7fff00',
chocolate: 'd2691e',
coral: 'ff7f50',
cornflowerblue: '6495ed',
cornsilk: 'fff8dc',
crimson: 'dc143c',
cyan: '0ff',
darkblue: '00008b',
darkcyan: '008b8b',
darkgoldenrod: 'b8860b',
darkgray: 'a9a9a9',
darkgreen: '006400',
darkgrey: 'a9a9a9',
darkkhaki: 'bdb76b',
darkmagenta: '8b008b',
darkolivegreen: '556b2f',
darkorange: 'ff8c00',
darkorchid: '9932cc',
darkred: '8b0000',
darksalmon: 'e9967a',
darkseagreen: '8fbc8f',
darkslateblue: '483d8b',
darkslategray: '2f4f4f',
darkslategrey: '2f4f4f',
darkturquoise: '00ced1',
darkviolet: '9400d3',
deeppink: 'ff1493',
deepskyblue: '00bfff',
dimgray: '696969',
dimgrey: '696969',
dodgerblue: '1e90ff',
firebrick: 'b22222',
floralwhite: 'fffaf0',
forestgreen: '228b22',
fuchsia: 'f0f',
gainsboro: 'dcdcdc',
ghostwhite: 'f8f8ff',
gold: 'ffd700',
goldenrod: 'daa520',
gray: '808080',
green: '008000',
greenyellow: 'adff2f',
grey: '808080',
honeydew: 'f0fff0',
hotpink: 'ff69b4',
indianred: 'cd5c5c',
indigo: '4b0082',
ivory: 'fffff0',
khaki: 'f0e68c',
lavender: 'e6e6fa',
lavenderblush: 'fff0f5',
lawngreen: '7cfc00',
lemonchiffon: 'fffacd',
lightblue: 'add8e6',
lightcoral: 'f08080',
lightcyan: 'e0ffff',
lightgoldenrodyellow: 'fafad2',
lightgray: 'd3d3d3',
lightgreen: '90ee90',
lightgrey: 'd3d3d3',
lightpink: 'ffb6c1',
lightsalmon: 'ffa07a',
lightseagreen: '20b2aa',
lightskyblue: '87cefa',
lightslategray: '789',
lightslategrey: '789',
lightsteelblue: 'b0c4de',
lightyellow: 'ffffe0',
lime: '0f0',
limegreen: '32cd32',
linen: 'faf0e6',
magenta: 'f0f',
maroon: '800000',
mediumaquamarine: '66cdaa',
mediumblue: '0000cd',
mediumorchid: 'ba55d3',
mediumpurple: '9370db',
mediumseagreen: '3cb371',
mediumslateblue: '7b68ee',
mediumspringgreen: '00fa9a',
mediumturquoise: '48d1cc',
mediumvioletred: 'c71585',
midnightblue: '191970',
mintcream: 'f5fffa',
mistyrose: 'ffe4e1',
moccasin: 'ffe4b5',
navajowhite: 'ffdead',
navy: '000080',
oldlace: 'fdf5e6',
olive: '808000',
olivedrab: '6b8e23',
orange: 'ffa500',
orangered: 'ff4500',
orchid: 'da70d6',
palegoldenrod: 'eee8aa',
palegreen: '98fb98',
paleturquoise: 'afeeee',
palevioletred: 'db7093',
papayawhip: 'ffefd5',
peachpuff: 'ffdab9',
peru: 'cd853f',
pink: 'ffc0cb',
plum: 'dda0dd',
powderblue: 'b0e0e6',
purple: '800080',
red: 'f00',
rosybrown: 'bc8f8f',
royalblue: '4169e1',
saddlebrown: '8b4513',
salmon: 'fa8072',
sandybrown: 'f4a460',
seagreen: '2e8b57',
seashell: 'fff5ee',
sienna: 'a0522d',
silver: 'c0c0c0',
skyblue: '87ceeb',
slateblue: '6a5acd',
slategray: '708090',
slategrey: '708090',
snow: 'fffafa',
springgreen: '00ff7f',
steelblue: '4682b4',
tan: 'd2b48c',
teal: '008080',
thistle: 'd8bfd8',
tomato: 'ff6347',
turquoise: '40e0d0',
violet: 'ee82ee',
wheat: 'f5deb3',
white: 'fff',
whitesmoke: 'f5f5f5',
yellow: 'ff0',
yellowgreen: '9acd32'
}";
}
}
}
Given this type:
public class ClassWithStaticAndNonStaticMembers
{
public static event System.EventHandler Event1 { add {} remove{} }
public event System.EventHandler Event2 { add {} remove{} }
public static event System.EventHandler Event3;
public event System.EventHandler Event4;
public static int Prop1 { get { return 0; } set {} }
public int Prop2 { get { return 0; } set {} }
public static int Prop3 { get; set; }
public int Prop4 { get; set; }
}
The following test will fail:
[Test]
public void StaticityOfAccessors() {
ITypeDefinition type = GetTypeDefinition(typeof(ClassWithStaticAndNonStaticMembers));
var evt1 = type.Events.Single(e => e.Name == "Event1");
Assert.That(evt1.IsStatic, Is.True);
Assert.That(evt1.AddAccessor.IsStatic, Is.True);
Assert.That(evt1.RemoveAccessor.IsStatic, Is.True);
var evt2 = type.Events.Single(e => e.Name == "Event2");
Assert.That(evt2.IsStatic, Is.False);
Assert.That(evt2.AddAccessor.IsStatic, Is.False);
Assert.That(evt2.RemoveAccessor.IsStatic, Is.False);
var evt3 = type.Events.Single(e => e.Name == "Event3");
Assert.That(evt3.IsStatic, Is.True);
Assert.That(evt3.AddAccessor.IsStatic, Is.True);
Assert.That(evt3.RemoveAccessor.IsStatic, Is.True);
var evt4 = type.Events.Single(e => e.Name == "Event4");
Assert.That(evt4.IsStatic, Is.False);
Assert.That(evt4.AddAccessor.IsStatic, Is.False);
Assert.That(evt4.RemoveAccessor.IsStatic, Is.False);
var prop1 = type.Properties.Single(e => e.Name == "Prop1");
Assert.That(prop1.IsStatic, Is.True);
Assert.That(prop1.Getter.IsStatic, Is.True);
Assert.That(prop1.Setter.IsStatic, Is.True);
var prop2 = type.Properties.Single(e => e.Name == "Prop2");
Assert.That(prop2.IsStatic, Is.False);
Assert.That(prop2.Getter.IsStatic, Is.False);
Assert.That(prop2.Setter.IsStatic, Is.False);
var prop3 = type.Properties.Single(e => e.Name == "Prop3");
Assert.That(prop3.IsStatic, Is.True);
Assert.That(prop3.Getter.IsStatic, Is.True);
Assert.That(prop3.Setter.IsStatic, Is.True);
var prop4 = type.Properties.Single(e => e.Name == "Prop4");
Assert.That(prop4.IsStatic, Is.False);
Assert.That(prop4.Getter.IsStatic, Is.False);
Assert.That(prop4.Setter.IsStatic, Is.False);
}
As a user of the library, I would be helped by a visitor pattern implementation for ResolveResults. Currently I have to do
...
if (rr is ThisResolveResult)
Visit((ThisResolveResult)rr);
else if (rr is MemberResolveResult)
Visit((MemberResolveResult)rr);
...
which works, but having the visitor pattern like for AstNodes would make it easier.
I think it would be useful if resolving the iterator inside a foreach() somehow returned the invoked GetEnumerator method
Is it possible to determine through the use of ResolveResults and/or AstNodes whether a method call has been removed because its [Conditional] constraints were not fullfilled?
eg. determine if the call to Method() below is removed
class C {
[System.Diagnostics.Conditional(""TEST"")]
void Method() {
}
public void M() {
Method();
}
}
Hardly the most important feature ever, though.
This test passes:
[Test]
public void Test() {
string program = @"using System;
class TestClass {
int F();
public void M() {
Action f;
$f = F$;
}
}";
var rr = Resolve<OperatorResolveResult>(program).Operands[1];
Assert.That(rr, Is.InstanceOf<ConversionResolveResult>());
}
However, when combining the declaration and initialization of the delegate:
class TestClass {
int F();
public void M() {
Action f = F;
}
}
there seems to be no ConversionResolveResult. This might be by design, but I find it strange to get different results depending on whether I combine the declaration and assignment.
When initializing a list as in the code below:
class Foo : Bar {
public void Bar() {
var a = new List<String> { "one", "two", "three" };
}
}
The parser creates extra braces in the initialization (I was able to isolate it to the parser) so the resulting code would have extra braces (modified formatting since extra AST nodes are the problem):
class Foo : Bar {
public void Bar () {
var a = new List<String> { { "one" }, { "two" }, { "three" } };
}
}
I created a bisect script and boo program and was able to isolate the initial broken changeset to d6d1f08
To recreate, I ran git bisect as follows and placed the two scripts on the parent directory to NRefactory:
git bisect start HEAD 3eee3
git bisect run ../bisector.sh
import System.IO
import ICSharpCode.NRefactory.CSharp
code = """
class Foo : Bar {
public void Bar() {
var a = new List<String> { "one", "two", "three" };
}
}
"""
parser = CSharpParser()
compilationUnit = parser.Parse(StringReader(code), "foo.cs", 0)
writer = StringWriter()
outVisitor = CSharpOutputVisitor(writer, CSharpFormattingOptions())
compilationUnit.AcceptVisitor(outVisitor)
print writer.ToString()
WORKING_DIR=$PWD
echo $WORKING_DIR
BASE_DIR=NRefactory/ICSharpCode.NRefactory
cd ${BASE_DIR}.CSharp
echo "Cleaning"
xbuild /t:Clean > /dev/null 2>&1
echo "Building"
xbuild > /dev/null 2>&1
echo "Compile Script"
cd $WORKING_DIR
booc -lib:${BASE_DIR}/bin/Debug/ ObjectCreateParserRegression.boo > /dev/null 2>&1
mv ObjectCreateParserRegression.exe* $BASE_DIR/bin/Debug
echo "Run Script"
cd ${BASE_DIR}/bin/Debug
OPEN_BRACE_COUNT=$(mono ./ObjectCreateParserRegression.exe | grep '{' | wc -l)
cd $WORKING_DIR
# Correct result should have three open braces
if [ $OPEN_BRACE_COUNT -ne "3" ]; then
echo "FAIL"$OPEN_BRACE_COUNT
exit 1
fi
echo "SUCCESS"$OPEN_BRACE_COUNT
This test passes:
[Test]
public void GenericMethodGroups()
{
string program = @"using System;
class TestClass {
void F<T>(T x) {}
public void M() {
System.Action<int> f;
f = $F<int>$;
}
}";
var rr = Resolve<MethodGroupResolveResult>(program);
Assert.That(rr.TypeArguments.Select(a => a.GetDefinition().Name).ToList(), Is.EqualTo(new[] { "Int32" }));
}
but this one fails:
[Test]
public void GenericMethodGroups2()
{
string program = @"using System;
class TestClass {
void F<T>(T x) {}
public void M() {
System.Action<int> f;
f = $F$;
}
}";
var rr = Resolve<MethodGroupResolveResult>(program);
Assert.That(rr.TypeArguments.Select(a => a.GetDefinition().Name).ToList(), Is.EqualTo(new[] { "Int32" }));
}
The only difference is that the generic argument is explicitly specified in the first case, but not in the second one. This may or may not be by design, but if it is by design then it would be a major improvement if the member ConversionResolveResult.Conversion.Method
would contain the specialized method in this case.
When using the FindReferencedEntities navigator, for some files a "NullReferenceException: Object reference not set to an instance of an object" occurs.
I have no experience in C# programming so please forgive the following code i wrote to reproduce the problem:
public class Reproduction {
public static void Main(string[] args) {
string filename = "./test.cs";
CSharpParser parser = new CSharpParser();
CompilationUnit compilationUnit = parser.Parse(new StreamReader(
filename).ReadToEnd(), filename);
CSharpParsedFile parsedFile = compilationUnit.ToTypeSystem();
IProjectContent project = new CSharpProjectContent();
ICompilation compilation;
project = project.UpdateProjectContent(null, parsedFile);
compilation = project.CreateCompilation();
getReferencedEntities(compilationUnit, compilation, parsedFile);
}
public static void getReferencedEntities(CompilationUnit cunit, ICompilation compilation, CSharpParsedFile parsedFile) {
var navigator = new FindReferencedEntities(delegate(AstNode node, IEntity entity){});
CSharpAstResolver resolver = new CSharpAstResolver(parsedFile.GetResolver(
compilation, cunit.StartLocation), cunit, parsedFile);
resolver.ApplyNavigator(navigator);
}
One file this is reproducible on can be found here: http://sharpmap.codeplex.com/SourceControl/changeset/view/96745#1376708
I include the stacktrace here, i hope it will help:
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
at ICSharpCode.NRefactory.CSharp.Resolver.FindReferencedEntities.ProcessConversion (ICSharpCode.NRefactory.CSharp.Expression expression, ICSharpCode.NRefactory.Semantics.ResolveResult result, ICSharpCode.NRefactory.Semantics.Conversion conversion, IType targetType) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/FindReferencedEntities.cs:71
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ProcessConversion (ICSharpCode.NRefactory.CSharp.Expression expr, ICSharpCode.NRefactory.Semantics.ResolveResult rr, ICSharpCode.NRefactory.Semantics.Conversion conversion, IType targetType) [0x00083] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:338
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ProcessConversionResult (ICSharpCode.NRefactory.CSharp.Expression expr, ICSharpCode.NRefactory.Semantics.ConversionResolveResult rr) [0x00006] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:377
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ProcessConversionsInInvocation (ICSharpCode.NRefactory.CSharp.Expression target, IEnumerable1 arguments, ICSharpCode.NRefactory.CSharp.Resolver.CSharpInvocationResolveResult invocation) [0x000ab] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:409 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitConstructorInitializer (ICSharpCode.NRefactory.CSharp.ConstructorInitializer constructorInitializer) [0x00060] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:3584 at ICSharpCode.NRefactory.CSharp.ConstructorInitializer.AcceptVisitor[ResolveResult] (IAstVisitor
1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/TypeMembers/ConstructorDeclaration.cs:163
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0000c] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:277
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitMethodMember (ICSharpCode.NRefactory.CSharp.EntityDeclaration member) [0x00024] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:752
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitConstructorDeclaration (ICSharpCode.NRefactory.CSharp.ConstructorDeclaration constructorDeclaration) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:775
at ICSharpCode.NRefactory.CSharp.ConstructorDeclaration.AcceptVisitor[ResolveResult](IAstVisitor1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/TypeMembers/ConstructorDeclaration.cs:72 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0000c] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:277 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitTypeOrDelegate (ICSharpCode.NRefactory.CSharp.AstNode typeDeclaration, System.String name, Int32 typeParameterCount) [0x000d8] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:594 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitTypeDeclaration (ICSharpCode.NRefactory.CSharp.TypeDeclaration typeDeclaration) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:608 at ICSharpCode.NRefactory.CSharp.TypeDeclaration.AcceptVisitor[ResolveResult](IAstVisitor
1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TypeDeclaration.cs:94
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0000c] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:277
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitNamespaceDeclaration (ICSharpCode.NRefactory.CSharp.NamespaceDeclaration namespaceDeclaration) [0x00044] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:560
at ICSharpCode.NRefactory.CSharp.NamespaceDeclaration.AcceptVisitor[ResolveResult](IAstVisitor1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/NamespaceDeclaration.cs:123 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0000c] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:277 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitCompilationUnit (ICSharpCode.NRefactory.CSharp.CompilationUnit unit) [0x0003e] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:546 at ICSharpCode.NRefactory.CSharp.CompilationUnit.AcceptVisitor[ResolveResult](IAstVisitor
1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/CompilationUnit.cs:105
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199
at ICSharpCode.NRefactory.CSharp.Resolver.CSharpAstResolver.ApplyNavigator (IResolveVisitorNavigator navigator, CancellationToken cancellationToken) [0x00057] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/CSharpAstResolver.cs:132
at BugTest.Reproduction.getReferencedEntities (ICSharpCode.NRefactory.CSharp.CompilationUnit cunit, ICompilation compilation, ICSharpCode.NRefactory.CSharp.TypeSystem.CSharpParsedFile parsedFile) [0x00038] in /home/polygox/Projects/BugTest/BugTest/BugTest.cs:41
at BugTest.Reproduction.Main (System.String[] args) [0x00041] in /home/polygox/Projects/BugTest/BugTest/BugTest.cs:33
[ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
at ICSharpCode.NRefactory.CSharp.Resolver.FindReferencedEntities.ProcessConversion (ICSharpCode.NRefactory.CSharp.Expression expression, ICSharpCode.NRefactory.Semantics.ResolveResult result, ICSharpCode.NRefactory.Semantics.Conversion conversion, IType targetType) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/FindReferencedEntities.cs:71
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ProcessConversion (ICSharpCode.NRefactory.CSharp.Expression expr, ICSharpCode.NRefactory.Semantics.ResolveResult rr, ICSharpCode.NRefactory.Semantics.Conversion conversion, IType targetType) [0x00083] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:338
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ProcessConversionResult (ICSharpCode.NRefactory.CSharp.Expression expr, ICSharpCode.NRefactory.Semantics.ConversionResolveResult rr) [0x00006] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:377
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ProcessConversionsInInvocation (ICSharpCode.NRefactory.CSharp.Expression target, IEnumerable1 arguments, ICSharpCode.NRefactory.CSharp.Resolver.CSharpInvocationResolveResult invocation) [0x000ab] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:409 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitConstructorInitializer (ICSharpCode.NRefactory.CSharp.ConstructorInitializer constructorInitializer) [0x00060] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:3584 at ICSharpCode.NRefactory.CSharp.ConstructorInitializer.AcceptVisitor[ResolveResult] (IAstVisitor
1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/TypeMembers/ConstructorDeclaration.cs:163
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0000c] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:277
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitMethodMember (ICSharpCode.NRefactory.CSharp.EntityDeclaration member) [0x00024] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:752
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitConstructorDeclaration (ICSharpCode.NRefactory.CSharp.ConstructorDeclaration constructorDeclaration) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:775
at ICSharpCode.NRefactory.CSharp.ConstructorDeclaration.AcceptVisitor[ResolveResult](IAstVisitor1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/TypeMembers/ConstructorDeclaration.cs:72 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0000c] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:277 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitTypeOrDelegate (ICSharpCode.NRefactory.CSharp.AstNode typeDeclaration, System.String name, Int32 typeParameterCount) [0x000d8] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:594 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitTypeDeclaration (ICSharpCode.NRefactory.CSharp.TypeDeclaration typeDeclaration) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:608 at ICSharpCode.NRefactory.CSharp.TypeDeclaration.AcceptVisitor[ResolveResult](IAstVisitor
1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TypeDeclaration.cs:94
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0000c] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:277
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitNamespaceDeclaration (ICSharpCode.NRefactory.CSharp.NamespaceDeclaration namespaceDeclaration) [0x00044] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:560
at ICSharpCode.NRefactory.CSharp.NamespaceDeclaration.AcceptVisitor[ResolveResult](IAstVisitor1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/NamespaceDeclaration.cs:123 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0000c] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:277 at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ICSharpCode.NRefactory.CSharp.IAstVisitor<ICSharpCode.NRefactory.Semantics.ResolveResult>.VisitCompilationUnit (ICSharpCode.NRefactory.CSharp.CompilationUnit unit) [0x0003e] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:546 at ICSharpCode.NRefactory.CSharp.CompilationUnit.AcceptVisitor[ResolveResult](IAstVisitor
1 visitor) [0x00000] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/CompilationUnit.cs:105
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve (ICSharpCode.NRefactory.CSharp.AstNode node) [0x00051] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:227
at ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan (ICSharpCode.NRefactory.CSharp.AstNode node) [0x0011a] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs:199
at ICSharpCode.NRefactory.CSharp.Resolver.CSharpAstResolver.ApplyNavigator (IResolveVisitorNavigator navigator, CancellationToken cancellationToken) [0x00057] in /home/polygox/work/nref5/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/CSharpAstResolver.cs:132
at BugTest.Reproduction.getReferencedEntities (ICSharpCode.NRefactory.CSharp.CompilationUnit cunit, ICompilation compilation, ICSharpCode.NRefactory.CSharp.TypeSystem.CSharpParsedFile parsedFile) [0x00038] in /home/polygox/Projects/BugTest/BugTest/BugTest.cs:41
at BugTest.Reproduction.Main (System.String[] args) [0x00041] in /home/polygox/Projects/BugTest/BugTest/BugTest.cs:33
Die Anwendung wurde durch ein Signal beendet: SIGHUP
It would be really helpful if resolving this:
var x = new MyClass { Property1 = 1, Property2 = { "Value1", "Value2" } }
would result in some kind of ObjectCreationResolveResult that contains information about the set properties and invoked collection add methods.
class Foo
{
#if false
int nop;
#endif
}
class Foo
{
#if AAA
int nop1;
#elif BBB
int nop2;
#endif
}
I don't know whether this actually qualifies as an issue, but it did cause me some headache so I thought I'd report it.
The scenario is that I was creating a Dictionary<IVariable, MyProject.VariableData>
containing all local variables defined in a function. This works well, except when it comes to lambda parameters, as there seems to be a few versions of those, as illustrated by this test:
[Test]
public void LambdaParameterIdentity() {
string code = @"using System;
class TestClass {
void F() {
Func<int, int> f = $i => i + 1;
}
}";
CompilationUnit cu = new CSharpParser().Parse(new StringReader(code.Replace("$", "")), "test.cs");
var dollar = FindDollarSigns(code).Single();
SetUp();
CSharpParsedFile parsedFile = cu.ToTypeSystem();
project = project.UpdateProjectContent(null, parsedFile);
compilation = project.CreateCompilation();
FindNodeVisitor fnv = new FindNodeVisitor(new TextLocation(dollar.Line, dollar.Column), new TextLocation(dollar.Line, dollar.Column + 10));
cu.AcceptVisitor(fnv);
var lambda = (LambdaExpression)fnv.ResultNode;
fnv = new FindNodeVisitor(new TextLocation(dollar.Line, dollar.Column + 5), new TextLocation(dollar.Line, dollar.Column + 6));
cu.AcceptVisitor(fnv);
var innerI = (IdentifierExpression)fnv.ResultNode;
CSharpAstResolver resolver = new CSharpAstResolver(compilation, cu, parsedFile);
var first = resolver.Resolve(lambda.Parameters.First());
var second = ((LambdaResolveResult)resolver.Resolve(lambda)).Parameters[0];
var inner = resolver.Resolve(innerI);
Assert.AreSame(first, second);
Assert.AreSame(first, inner);
}
As demonstrated, the identity of the LocalResolveResult representing "i" will be different whether you
Code sample:
public partial class MyAttribute : Attribute
{
public string[] Sources { get; set; }
}
[assembly: My(Sources = new string[]{"a", "b", "c"})]
When resolving the assembly attribute usage, array is resolved with error, and is resolved to string[][](array of array of strings), instead of string[](array of strings)
Failing test:
[Test]
public void ImplicitTypeParameterConversion()
{
string program = @"using System;
class Test {
public void M<T, U>() where T : U {
T t = default(T);
U u = $(U)t$;
}";
var c = GetConversion(program);
Assert.IsTrue(c.IsValid); // This part passes
program = @"using System;
class Test {
public void M<T, U>() where T : U {
T t = default(T);
U u = $t$;
}";
c = GetConversion(program);
Assert.IsTrue(c.IsValid); // This part fails
}
Also, the conversion reported in the (passing) first part of the test is an identity conversion, which is not necessarily true.
Currently, they are called get_X and set_X
Sometimes, when launching ResolveVisitor.Scan(CompilationUnit) a NullReferenceException occurs in PerformOverloadResolution method. It is caused by the fact that 'resolver' variable in MethodGroupResolveResult is null and that is why in line:
var extensionMethods = this.GetExtensionMethods(); //line 173
we've got null. In next line we try to check condition:
if(extensionMethods.Count > 0) //line 175
which results in throwing an exception. I tried debugging but I didn't found out what cause it. I scan hundreds of .cs files and only in a few of them this exception is thrown.
Underneath I enclose StackTrace:
In ICSharpCode.NRefactory.CSharp.Resolver.MethodGroupResolveResult.PerformOverloadResolution(ITypeResolveContext context, ResolveResult[] arguments, String[] argumentNames, Boolean allowExtensionMethods, Boolean allowExpandingParams) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\MethodGroupResolveResult.cs:line 175
In ICSharpCode.NRefactory.CSharp.Resolver.CSharpResolver.ResolveInvocation(ResolveResult target, ResolveResult[] arguments, String[] argumentNames) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\CSharpResolver.cs:line 2242
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ResolveInvocationOnGivenTarget(ResolveResult target, InvocationExpression invocationExpression) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line1415
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitInvocationExpression(InvocationExpression invocationExpression, Object data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 1403
In ICSharpCode.NRefactory.CSharp.InvocationExpression.AcceptVisitor[T,S](IAstVisitor2 visitor, T data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Ast\Expressions\InvocationExpression.cs:line 55 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Resolve(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 196 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 176 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 232 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitExpressionStatement(ExpressionStatement expressionStatement, Object data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 2180 In ICSharpCode.NRefactory.CSharp.ExpressionStatement.AcceptVisitor[T,S](IAstVisitor
2 visitor, T data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Ast\Statements\ExpressionStatement.cs:line 45
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 172
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 232
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitBlockStatement(BlockStatement blockStatement, Object data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 2001
In ICSharpCode.NRefactory.CSharp.BlockStatement.AcceptVisitor[T,S](IAstVisitor2 visitor, T data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Ast\Statements\BlockStatement.cs:line 110 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 172 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 232 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitMethodMember(AttributedNode member) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 529 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitMethodDeclaration(MethodDeclaration methodDeclaration, Object data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 542 In ICSharpCode.NRefactory.CSharp.MethodDeclaration.AcceptVisitor[T,S](IAstVisitor
2 visitor, T data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Ast\TypeMembers\MethodDeclaration.cs:line 68
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 172
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitTypeOrDelegate(AstNode typeDeclaration) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 408
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitTypeDeclaration(TypeDeclaration typeDeclaration, Object data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 420
In ICSharpCode.NRefactory.CSharp.TypeDeclaration.AcceptVisitor[T,S](IAstVisitor2 visitor, T data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Ast\GeneralScope\TypeDeclaration.cs:line 105 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 172 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 232 In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration, Object data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 372 In ICSharpCode.NRefactory.CSharp.NamespaceDeclaration.AcceptVisitor[T,S](IAstVisitor
2 visitor, T data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Ast\GeneralScope\NamespaceDeclaration.cs:line 114
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 172
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.ScanChildren(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 232
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.VisitCompilationUnit(CompilationUnit unit, Object data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 358
In ICSharpCode.NRefactory.CSharp.CompilationUnit.AcceptVisitor[T,S](IAstVisitor`2 visitor, T data) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Ast\CompilationUnit.cs:line 88
In ICSharpCode.NRefactory.CSharp.Resolver.ResolveVisitor.Scan(AstNode node) in C:\Users\dfa\Desktop\dlls\NewNRefactory\ICSharpCode.NRefactory\CSharp\Resolver\ResolveVisitor.cs:line 172
In Kruk.Tracker.CSharp.SourceAnalyser.SourceAnalyser.Refers() in C:\Users\dfa\svn\TestingProject\trunk\Tracker\SourceAnalyser\SourceAnalyser.cs:line 213
If necessary I can provide more information or support to fix the issue.
Currently, the expression MyEvent += MyHandler
is resolved to a compound AddAssign. This works, but it is a little unintuitive since the semantics is not an addition at all, but it's just syntactic sugar for a method invocation. I guess this also means that find references won't work for event add accessor
Failing test:
[Test]
public void FindAddEventAccessor()
{
Init(@"using System;
class Test {
public event EventHandler MyEvent { add {} remove {} }
static void T() {
MyEvent += null;
}
}");
var test = compilation.MainAssembly.TopLevelTypeDefinitions.Single(t => t.Name == "Test");
var addAccessor = test.Events.Single(m => m.Name == "MyEvent").AddAccessor;
var actual = FindReferences(addAccessor).ToList();
Assert.IsTrue(actual.Any(r => r.StartLocation.Line == 5));
}
a731b93 fixed it for binary operators, but it still doesn't work for the unary ones.
When the code that need to be parsed starts with a comment, all comments are added to the end of the type.
For example:
// Test
using System;
class Test
{
// Another Test
public void Main (string[] args)
{
Console.WriteLine ("Hello, World");
}
}
Becomes:
using System;
class Test
{
public void Main (string[] args)
{
Console.WriteLine ("Hello, World");
}
}
// Test
// Another Test
Christoph
It would help me a lot to have a way to determine if a ThisResolveResult
represents a "this." or a "base."
This could either be a property bool IsBaseReference
, or a separate IType OriginalType
property.
Another possibility to achieve what I need could be to add a new bool IsVirtualCall
to InvocationResolveResult
, which would be false if calling the base implementation.
When running the type importer over this code:
class C { partial void M(); }
The resulting IType will contain the member void M()
, as far as I can tell not with any indication that the method is a partial method without implementation. Some kind of indication of this fact (such as an IsPartialMethodWithoutImplementation property on IMethod) would be useful.
As this test shows:
[Test]
public void InheritingInnerClassShouldNotCauseStackOverflow() {
string program = @"class Test : $Test.Base$, Test.ITest { public class Base {} interface ITest {} }";
var result = Resolve(program);
}
http://msdn.microsoft.com/en-us/library/hh534540(VS.110).aspx
Caller Information can appear in attributes or when looking at InvocationResolveResult.GetArgumentsForCall(), so NRefactory needs support for this feature.
Marked internal, can't find a different way to access the body of a lambda function. Am I missing something?
Currently, I'm hacking it using reflection, and all data looks ok.
Please help
Failing test:
[Test]
public void Test() {
string program = @"using System;
class TestClass {
static void F() {}
public void M() {
$F()$;
}
}";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.That(rr.TargetResult, Is.Not.InstanceOf<ThisResolveResult>());
}
Currently, new { X = 10, Y = 20 }
resolves to a vanilla ResolveResult.
[Test]
public void FirstParameterToExtensionMethod()
{
string program = @"
namespace N {
public class X {}
public static class Ex {
public static void F(this X x, int y, int z) {}
}
class C {
public void M() {
X a = null;
int b = 0, c = 0;
// BEGIN
$a.F(b, c)$;
// END
}
}
}";
var rr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(rr.IsError);
Assert.That(rr.IsExtensionMethodInvocation, Is.True);
Assert.That(rr.Arguments[0], Is.InstanceOf<LocalResolveResult>());
Assert.That(((LocalResolveResult)rr.Arguments[0]).Variable.Name, Is.EqualTo("a"));
Assert.That(rr.Arguments[1], Is.InstanceOf<LocalResolveResult>());
Assert.That(((LocalResolveResult)rr.Arguments[1]).Variable.Name, Is.EqualTo("b"));
Assert.That(rr.Arguments[2], Is.InstanceOf<LocalResolveResult>());
Assert.That(((LocalResolveResult)rr.Arguments[2]).Variable.Name, Is.EqualTo("c"));
}
All dynamic object member nodes are resolved to the same TypeResolveResult, which makes it hard to backreference which member was resolved:
Example:
dynamic x = new object();
x.Name = "adasdf";
x.Hello();
TypeResolveResult is the same instance for 'Name' and 'Hello' nodes.
If they were different instances, they could have been resolved back using a dictionary.
the following test fails with the message "File contains parsing errors". The error says- "compilation error- namespace elements cannot be explicitly private, protected or protected internal". Is this an expected behaviour?
Similar tests with "protected class TestClass" and "protected internal class TestClass" also fail with the same error.
[Test()]
public void ParsingError ()
{
string result = RunContextAction (new UseVarKeywordAction (),
@"private class TestClass
{
void Test ()
{
$TestClass aVar = this;
}
}");
Assert.AreEqual (@"class TestClass
{
void Test ()
{
var aVar = this;
}
}", result);
}
Repro:
namespace TestNamespace
{
public class TestClass
{
void TestMethod()
{
// The ArrayCreateExpression's TextLocations encompass "new int[]"; it should include the curly braces:
int[] testArray1 = new int[] { };
// The ArrayCreateExpression's TextLocations encompass "new int[] { 0, 1, 2 }", as expected:
int[] testArray2 = new int[] { 0, 1, 2 };
}
}
}
Hello,
first of all, I would like to thank you for this great piece of code.
Today I have found a weird bug in NRefactory that caused me some days of headaches, with TypeDeclarations that seemed to have their members defined twice. The issue is caused by the protected constructor of the CSharpProjectContent class, that does not set the right comparer for the parsedFiles member; would you be so kind as to add the Platform.FileNameComparer comparer where it should, please? It is a single line fix. I am new to GitHub (and Git, in general), otherwise I would have tried by myself.
Thank you.
Efran
Try the following sample in the demo app. The generated tree does not contain any nodes related to inheritance. Parsing and Generating the sample loses a great deal of information:
interface IInheritanceTest
{
void TestMethod();
}
class InheritanceTestParent : IInheritanceTest
{
public InheritanceTestParent(int i)
{
}
public void TestMethod()
{
}
}
class InheritanceTestChild : InheritanceTestParent
{
public InheritanceTestChild(int i)
: base(i)
{
TestMethod();
}
}
Hi!
I put this text to demo, then i selected node:
then click "Resolve" then i got "UnknownMemberResolveResult ?.MyClass
namespace PC { // Define an alias for the nested namespace. using Project = PC.MyCompany.Project; class A { Project.MyClass M() { // Use the alias Project.MyClass mc = new Project.MyClass(); return mc; } } namespace MyCompany { namespace Project { public class MyClass { } } } }
OR you can add this test:
[Test] public void UsingTest() { string program = @"namespace PC { // Define an alias for the nested namespace. using Project = PC.MyCompany.Project; class A { Project.MyClass M() { // Use the alias $Project.MyClass$ mc = new Project.MyClass(); return mc; } } namespace MyCompany { namespace Project { public class MyClass { } } } } "; var mrr = Resolve(program); Assert.AreEqual("PC.MyCompany.Project.MyClass", mrr.Type.FullName); }
Resolving (obj is Type) and (obj as Type) returns a default ResolveResult rather than some specialized kind of result.
Regardless of the formatting options, NRefactory always outputs lines that follow single-line comments completely unindented. I believe this is not intended behavior.
INPUT:
// This is the input file.
using System;
namespace ReproForNRefactoryCommentOutputBug
{
public sealed class FileToBeParsedAndWritten
{
public int SomeFunction()
{
// When NRefactory writes out the AST of this source file,
// the line following this comment will not be indented.
string text = "This line won't be indented.";
string moreText = "But this line will be formatted correctly.";
// This happens after all comments.
return 42;
}
}
}
EXPECTED: The output file's lines will be indented according to the CSharpFormattingOptions.
ACTUAL: Any lines in the output that follow a comment will be completely unindented.
// This is the actual output.
using System;
namespace ReproForNRefactoryCommentOutputBug
{
public sealed class FileToBeParsedAndWritten
{
public int SomeFunction ()
{
// When NRefactory writes out the AST of this source file,
// the line following this comment will not be indented.
string text = "This line won't be indented.";
string moreText = "But this line will be formatted correctly.";
// This happens after all comments.
return 42;
}
}
}
The parser errors out on enums with member declarations. Having explicit initializers makes no difference.
enum SimpleEnumTest
{
field1,
field2,
field3
}
enum SimpleEnumTest2
{
field1 = 0,
field2 = 1,
field3 = 2
}
Given this code (which compiles, to my surprise)
interface I {
void SomeMethod(int i);
}
class B {
public void SomeMethod(int i) {}
}
class D : B, I {
}
, is there any possibility in the type system to determine that B.SomeMethod
implements I.SomeMethod
?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.