LocationToOffset() public method

public LocationToOffset ( Mono.TextEditor.DocumentLocation location ) : int
location Mono.TextEditor.DocumentLocation
return int
Example #1
0
        public static void Down(TextEditorData data)
        {
            using (var undo = data.OpenUndoGroup()) {
                //on Mac, when deselecting and moving up/down a line, column is always the column of the selection's start
                if (Platform.IsMac && data.IsSomethingSelected && !data.Caret.PreserveSelection)
                {
                    int col  = data.MainSelection.Anchor > data.MainSelection.Lead ? data.MainSelection.Lead.Column : data.MainSelection.Anchor.Column;
                    int line = data.MainSelection.MaxLine + 1;
                    data.ClearSelection();
                    if (line <= data.Document.LineCount)
                    {
                        int offset = data.Document.LocationToOffset(line, col);
                        data.Caret.SetToOffsetWithDesiredColumn(MoveCaretOutOfFolding(data, offset));
                    }
                    else
                    {
                        data.Caret.Offset = data.Document.TextLength;
                    }
                    return;
                }

                if (data.Caret.Line < data.Document.LineCount)
                {
                    int nextLine = data.LogicalToVisualLine(data.Caret.Line) + 1;
                    int line     = data.VisualToLogicalLine(nextLine);
                    int offset   = MoveCaretOutOfFolding(data, data.LocationToOffset(line, data.Caret.Column), true);
                    data.Caret.SetToOffsetWithDesiredColumn(offset);
                }
                else
                {
                    ToDocumentEnd(data);
                }
            }
        }
Example #2
0
 public static void PageUp(TextEditorData data)
 {
     using (var undo = data.OpenUndoGroup()) {
         int pageLines  = (int)((data.VAdjustment.PageSize + ((int)data.VAdjustment.Value % data.LineHeight)) / data.LineHeight);
         int visualLine = data.LogicalToVisualLine(data.Caret.Line);
         visualLine -= pageLines;
         int line   = System.Math.Max(data.VisualToLogicalLine(visualLine), DocumentLocation.MinLine);
         int offset = data.LocationToOffset(line, data.Caret.Column);
         ScrollActions.PageUp(data);
         data.Caret.Offset = MoveCaretOutOfFolding(data, offset);
     }
 }
Example #3
0
        public void SetToOffsetWithDesiredColumn(int desiredOffset)
        {
            DocumentLocation old = Location;

            int desiredLineNumber = TextEditorData.Document.OffsetToLineNumber(desiredOffset);
            var desiredLine       = TextEditorData.Document.GetLine(desiredLineNumber);
            int newColumn         = desiredOffset - desiredLine.Offset + 1;

            if (desiredLine.Length + 1 < Column && newColumn == 1)
            {
                if (TextEditorData.HasIndentationTracker && TextEditorData.Options.IndentStyle == IndentStyle.Virtual)
                {
                    newColumn = TextEditorData.GetVirtualIndentationColumn(desiredLineNumber, 1);
                }
            }

            line   = desiredLineNumber;
            column = newColumn;
            var logicalDesiredColumn = desiredLine.GetLogicalColumn(TextEditorData, DesiredColumn);

            if (logicalDesiredColumn <= desiredLine.Length + 1)
            {
                int possibleOffset = TextEditorData.LocationToOffset(desiredLineNumber, logicalDesiredColumn);
                if (!TextEditorData.Document.GetFoldingsFromOffset(possibleOffset).Any(f => f.IsCollapsed))
                {
                    column = logicalDesiredColumn;
                }
            }
            else
            {
                column = System.Math.Max(newColumn, desiredLine.Length + 1);
            }

            UpdateCaretOffset();
            OnPositionChanged(new CaretLocationEventArgs(old, currentBuffer ?? TextEditorData.Document.TextBuffer.CurrentSnapshot, CaretChangeReason.Movement));
        }
        private InsertionPoint GetInsertionPoint(MonoDevelop.Ide.Gui.Document document, IType type)
        {
            data = document.Editor;
            if (data == null) {
                throw new System.ArgumentNullException ("data");
            }
            var parsedDocument = document.ParsedDocument;
            if (parsedDocument == null) {
                throw new System.ArgumentNullException ("parsedDocument");
            }
            if (type == null) {
                throw new System.ArgumentNullException ("type");
            }
            type = (parsedDocument.CompilationUnit.GetTypeAt (type.Location) ?? type);
            DomRegion domRegion = type.BodyRegion;
            var start = type.BodyRegion.Start.Line;
            indent = data.GetLine(start).GetIndentation(data.Document);
            DomLocation domLocation = domRegion.End;
            int num = data.LocationToOffset (domLocation.Line, 1);
            while (num < data.Length && data.GetCharAt(num) != '}') {
                num++;
            }
            num++;
            DocumentLocation documentLocation = data.OffsetToLocation (num);

            LineSegment lineAfterClassEnd = data.GetLine (domLocation.Line + 1);
            NewLineInsertion lineAfter;
            if (lineAfterClassEnd != null && lineAfterClassEnd.EditableLength == lineAfterClassEnd.GetIndentation (data.Document).Length)
                lineAfter = NewLineInsertion.BlankLine;
            else
                lineAfter = NewLineInsertion.None;

            return new InsertionPoint (documentLocation, NewLineInsertion.None, lineAfter);
        }
		public static List<InsertionPoint> GetInsertionPoints (TextEditorData data, ParsedDocument parsedDocument, IUnresolvedTypeDefinition type)
		{
			if (data == null)
				throw new ArgumentNullException ("data");
			if (parsedDocument == null)
				throw new ArgumentNullException ("parsedDocument");
			if (type == null)
				throw new ArgumentNullException ("type");
			
			// update type from parsed document, since this is always newer.
			//type = parsedDocument.GetInnermostTypeDefinition (type.GetLocation ()) ?? type;
			List<InsertionPoint> result = new List<InsertionPoint> ();
			int offset = data.LocationToOffset (type.Region.Begin);
			if (offset < 0 || type.BodyRegion.IsEmpty)
				return result;
			while (offset < data.Length && data.GetCharAt (offset) != '{') {
				offset++;
			}
			var realStartLocation = data.OffsetToLocation (offset);
			result.Add (GetInsertionPosition (data.Document, realStartLocation.Line, realStartLocation.Column));
			result [0].LineBefore = NewLineInsertion.None;
			
			foreach (var member in type.Members) {
				TextLocation domLocation = member.BodyRegion.End;
				if (domLocation.Line <= 0) {
					DocumentLine lineSegment = data.GetLine (member.Region.BeginLine);
					if (lineSegment == null)
						continue;
					domLocation = new TextLocation (member.Region.BeginLine, lineSegment.Length + 1);
				}
				result.Add (GetInsertionPosition (data.Document, domLocation.Line, domLocation.Column));
			}

			foreach (var nestedType in type.NestedTypes) {
				TextLocation domLocation = nestedType.BodyRegion.End;
				if (domLocation.Line <= 0) {
					DocumentLine lineSegment = data.GetLine (nestedType.Region.BeginLine);
					if (lineSegment == null)
						continue;
					domLocation = new TextLocation (nestedType.Region.BeginLine, lineSegment.Length + 1);
				}
				result.Add (GetInsertionPosition (data.Document, domLocation.Line, domLocation.Column));
			}

			result [result.Count - 1].LineAfter = NewLineInsertion.None;
			CheckStartPoint (data.Document, result [0], result.Count == 1);
			if (result.Count > 1) {
				result.RemoveAt (result.Count - 1); 
				NewLineInsertion insertLine;
				var lineBefore = data.GetLine (type.BodyRegion.EndLine - 1);
				if (lineBefore != null && lineBefore.Length == lineBefore.GetIndentation (data.Document).Length) {
					insertLine = NewLineInsertion.None;
				} else {
					insertLine = NewLineInsertion.Eol;
				}
				// search for line start
				int col = type.BodyRegion.EndColumn - 1;
				var line = data.GetLine (type.BodyRegion.EndLine);
				if (line != null) {
					while (col > 1 && char.IsWhiteSpace (data.GetCharAt (line.Offset + col - 2)))
						col--;
				}
				result.Add (new InsertionPoint (new DocumentLocation (type.BodyRegion.EndLine, col), insertLine, NewLineInsertion.Eol));
				CheckEndPoint (data.Document, result [result.Count - 1], result.Count == 1);
			}
			
			foreach (var region in parsedDocument.UserRegions.Where (r => type.BodyRegion.IsInside (r.Region.Begin))) {
				result.Add (new InsertionPoint (new DocumentLocation (region.Region.BeginLine + 1, 1), NewLineInsertion.Eol, NewLineInsertion.Eol));
				result.Add (new InsertionPoint (new DocumentLocation (region.Region.EndLine, 1), NewLineInsertion.Eol, NewLineInsertion.Eol));
				result.Add (new InsertionPoint (new DocumentLocation (region.Region.EndLine + 1, 1), NewLineInsertion.Eol, NewLineInsertion.Eol));
			}
			result.Sort ((left, right) => left.Location.CompareTo (right.Location));
			return result;
		}
Example #6
0
        public static bool IsFolded(TextEditorData data, int line, int column)
        {
            int offset = data.LocationToOffset(line, column);

            return(data.Document.GetFoldingsFromOffset(offset).Any(f => f.isFolded && f.Offset < offset && offset < f.EndOffset));
        }
		public static void PageUp (TextEditorData data)
		{
			int pageLines = (int)((data.VAdjustment.PageSize + ((int)data.VAdjustment.Value % data.LineHeight)) / data.LineHeight);
			int visualLine = data.LogicalToVisualLine (data.Caret.Line);
			visualLine -= pageLines;
			int line = System.Math.Max (data.VisualToLogicalLine (visualLine), DocumentLocation.MinLine);
			int offset = data.LocationToOffset (line, data.Caret.Column);
			ScrollActions.PageUp (data);
			data.Caret.Offset = MoveCaretOutOfFolding (data, offset);
		}
		public static bool IsFolded (TextEditorData data, int line, int column)
		{
			int offset = data.LocationToOffset (line, column);
			return data.Document.GetFoldingsFromOffset (offset).Any (f => f.isFolded && f.Offset < offset && offset < f.EndOffset);
		}
		public static void Down (TextEditorData data)
		{
			//on Mac, when deselecting and moving up/down a line, column is always the column of the selection's start
			if (Platform.IsMac && data.IsSomethingSelected && !data.Caret.PreserveSelection) {
				int col = data.MainSelection.Anchor > data.MainSelection.Lead ? data.MainSelection.Lead.Column : data.MainSelection.Anchor.Column;
				int line = data.MainSelection.MaxLine + 1;
				data.ClearSelection ();
				if (line <= data.Document.LineCount) {
					int offset = data.Document.LocationToOffset (line, col);
					data.Caret.SetToOffsetWithDesiredColumn (MoveCaretOutOfFolding (data, offset));
				} else {
					data.Caret.Offset = data.Document.TextLength;
				}
				return;
			}
			
			if (data.Caret.Line < data.Document.LineCount) {
				int nextLine = data.LogicalToVisualLine (data.Caret.Line) + 1;
				int line = data.VisualToLogicalLine (nextLine);
				int offset = MoveCaretOutOfFolding (data, data.LocationToOffset (line, data.Caret.Column), true);
				data.Caret.SetToOffsetWithDesiredColumn (offset);
			} else {
				ToDocumentEnd (data);
			}
		}
        MemberReference GetReference(Project project, ResolveResult result, AstNode node, SyntaxTree syntaxTree, string fileName, Mono.TextEditor.TextEditorData editor)
        {
            AstNode originalNode = node;

            if (result == null)
            {
                return(null);
            }

            object valid = null;

            if (result is MethodGroupResolveResult)
            {
                valid = ((MethodGroupResolveResult)result).Methods.FirstOrDefault(
                    m => searchedMembers.Any(member => member is IMethod && ((IMethod)member).Region == m.Region));
            }
            else if (result is MemberResolveResult)
            {
                var foundMember = ((MemberResolveResult)result).Member;
                valid = searchedMembers.FirstOrDefault(
                    member => member is IMember && ((IMember)member).Region == foundMember.Region);
            }
            else if (result is NamespaceResolveResult)
            {
                var ns = ((NamespaceResolveResult)result).Namespace;
                valid = searchedMembers.FirstOrDefault(n => n is INamespace && ns.FullName.StartsWith(((INamespace)n).FullName, StringComparison.Ordinal));
            }
            else if (result is LocalResolveResult)
            {
                var ns = ((LocalResolveResult)result).Variable;
                valid = searchedMembers.FirstOrDefault(n => n is IVariable && ((IVariable)n).Region == ns.Region);
            }
            else if (result is TypeResolveResult)
            {
                valid = searchedMembers.FirstOrDefault(n => n is IType);
            }
            else
            {
                valid = searchedMembers.FirstOrDefault();
            }

            if (node is ConstructorInitializer)
            {
                return(null);
            }
            if (node is ObjectCreateExpression)
            {
                node = ((ObjectCreateExpression)node).Type;
            }

            if (node is InvocationExpression)
            {
                node = ((InvocationExpression)node).Target;
            }

            if (node is MemberReferenceExpression)
            {
                node = ((MemberReferenceExpression)node).MemberNameToken;
            }

            if (node is SimpleType)
            {
                node = ((SimpleType)node).IdentifierToken;
            }

            if (node is MemberType)
            {
                node = ((MemberType)node).MemberNameToken;
            }

            if (node is NamespaceDeclaration)
            {
                var nsd = ((NamespaceDeclaration)node);
                node = nsd.Identifiers.LastOrDefault(n => n.Name == memberName) ?? nsd.Identifiers.FirstOrDefault();
                if (node == null)
                {
                    return(null);
                }
            }

            if (node is TypeDeclaration && (searchedMembers.First() is IType))
            {
                node = ((TypeDeclaration)node).NameToken;
            }
            if (node is DelegateDeclaration)
            {
                node = ((DelegateDeclaration)node).NameToken;
            }

            if (node is EntityDeclaration && (searchedMembers.First() is IMember))
            {
                node = ((EntityDeclaration)node).NameToken;
            }

            if (node is ParameterDeclaration && (searchedMembers.First() is IParameter))
            {
                node = ((ParameterDeclaration)node).NameToken;
            }
            if (node is ConstructorDeclaration)
            {
                node = ((ConstructorDeclaration)node).NameToken;
            }
            if (node is DestructorDeclaration)
            {
                node = ((DestructorDeclaration)node).NameToken;
            }
            if (node is NamedArgumentExpression)
            {
                node = ((NamedArgumentExpression)node).NameToken;
            }
            if (node is NamedExpression)
            {
                node = ((NamedExpression)node).NameToken;
            }
            if (node is VariableInitializer)
            {
                node = ((VariableInitializer)node).NameToken;
            }

            if (node is IdentifierExpression)
            {
                node = ((IdentifierExpression)node).IdentifierToken;
            }

            var region = new DomRegion(fileName, node.StartLocation, node.EndLocation);

            var length = node is PrimitiveType ? keywordName.Length : node.EndLocation.Column - node.StartLocation.Column;

            return(new CSharpMemberReference(project, originalNode, syntaxTree, valid, region, editor.LocationToOffset(region.Begin), length));
        }
		public static List<InsertionPoint> GetInsertionPoints (TextEditorData data, ParsedDocument parsedDocument, IType type)
		{
			if (data == null)
				throw new ArgumentNullException ("data");
			if (parsedDocument == null)
				throw new ArgumentNullException ("parsedDocument");
			if (type == null)
				throw new ArgumentNullException ("type");
			List<InsertionPoint> result = new List<InsertionPoint> ();
			int offset = data.LocationToOffset (type.BodyRegion.Start.Line, type.BodyRegion.Start.Column);
			if (offset < 0)
				return result;
			
			while (offset < data.Length && data.GetCharAt (offset) != '{') {
				offset++;
			}
			
			var realStartLocation = data.OffsetToLocation (offset);
			result.Add (GetInsertionPosition (data.Document, realStartLocation.Line, realStartLocation.Column));
			result[0].LineBefore = NewLineInsertion.None;
			foreach (IMember member in type.Members) {
				DomLocation domLocation = member.BodyRegion.End;
				if (domLocation.Line <= 0) {
					LineSegment lineSegment = data.GetLine (member.Location.Line);
					if (lineSegment == null)
						continue;
					domLocation = new DomLocation (member.Location.Line, lineSegment.EditableLength + 1);
				}
				result.Add (GetInsertionPosition (data.Document, domLocation.Line, domLocation.Column));
			}
			result[result.Count - 1].LineAfter = NewLineInsertion.None;
			CheckStartPoint (data.Document, result[0], result.Count == 1);
			if (result.Count > 1) {
				result.RemoveAt (result.Count - 1); 
				NewLineInsertion insertLine;
				var lineBefore = data.GetLine (type.BodyRegion.End.Line - 1);
				if (lineBefore != null && lineBefore.EditableLength == lineBefore.GetIndentation (data.Document).Length) {
					insertLine = NewLineInsertion.None;
				} else {
					insertLine = NewLineInsertion.Eol;
				}
				// search for line start
				var line = data.GetLine (type.BodyRegion.End.Line);
				int col = type.BodyRegion.End.Column - 1;
				while (col > 1 && char.IsWhiteSpace (data.GetCharAt (line.Offset + col - 2)))
					col--;
				result.Add (new InsertionPoint (new DocumentLocation (type.BodyRegion.End.Line, col), insertLine, NewLineInsertion.Eol));
				CheckEndPoint (data.Document, result[result.Count - 1], result.Count == 1);
			}
			
			foreach (var region in parsedDocument.UserRegions.Where (r => type.BodyRegion.Contains (r.Region))) {
				result.Add (new InsertionPoint (new DocumentLocation (region.Region.Start.Line + 1, 1), NewLineInsertion.Eol, NewLineInsertion.Eol));
				result.Add (new InsertionPoint (new DocumentLocation (region.Region.End.Line, 1), NewLineInsertion.Eol, NewLineInsertion.Eol));
				result.Add (new InsertionPoint (new DocumentLocation (region.Region.End.Line + 1, 1), NewLineInsertion.Eol, NewLineInsertion.Eol));
			}
			result.Sort ((left, right) => left.Location.CompareTo (right.Location));
			return result;
		}
        MemberReference GetReference(ResolveResult result, AstNode node, string fileName, Mono.TextEditor.TextEditorData editor)
        {
            if (result == null)
            {
                return(null);
            }

            object valid = null;

            if (result is MethodGroupResolveResult)
            {
                valid = ((MethodGroupResolveResult)result).Methods.FirstOrDefault(
                    m => searchedMembers.Any(member => member is IMethod && ((IMethod)member).Region == m.Region));
            }
            else if (result is MemberResolveResult)
            {
                var foundMember = ((MemberResolveResult)result).Member;
                valid = searchedMembers.FirstOrDefault(
                    member => member is IMember && ((IMember)member).Region == foundMember.Region);
            }
            else if (result is NamespaceResolveResult)
            {
                var ns = ((NamespaceResolveResult)result).NamespaceName;
                valid = searchedMembers.FirstOrDefault(n => n is string && n.ToString() == ns);
            }
            else if (result is LocalResolveResult)
            {
                var ns = ((LocalResolveResult)result).Variable;
                valid = searchedMembers.FirstOrDefault(n => n is IVariable && ((IVariable)n).Region == ns.Region);
            }
            else if (result is TypeResolveResult)
            {
                valid = searchedMembers.FirstOrDefault(n => n is IType);
            }
            else
            {
                valid = searchedMembers.FirstOrDefault();
            }
            if (node is ConstructorInitializer)
            {
                return(null);
            }

            if (node is ObjectCreateExpression)
            {
                node = ((ObjectCreateExpression)node).Type;
            }

            if (node is InvocationExpression)
            {
                node = ((InvocationExpression)node).Target;
            }

            if (node is MemberReferenceExpression)
            {
                node = ((MemberReferenceExpression)node).MemberNameToken;
            }

            if (node is MemberType)
            {
                node = ((MemberType)node).MemberNameToken;
            }

            if (node is TypeDeclaration && (searchedMembers.First() is IType))
            {
                node = ((TypeDeclaration)node).NameToken;
            }

            if (node is EntityDeclaration && (searchedMembers.First() is IMember))
            {
                node = ((EntityDeclaration)node).NameToken;
            }

            if (node is ParameterDeclaration && (searchedMembers.First() is IParameter))
            {
                node = ((ParameterDeclaration)node).NameToken;
            }
            if (node is ConstructorDeclaration)
            {
                node = ((ConstructorDeclaration)node).NameToken;
            }
            if (node is DestructorDeclaration)
            {
                node = ((DestructorDeclaration)node).NameToken;
            }
            if (node is NamedArgumentExpression)
            {
                node = ((NamedArgumentExpression)node).NameToken;
            }
            if (node is NamedExpression)
            {
                node = ((NamedExpression)node).NameToken;
            }
            if (node is VariableInitializer)
            {
                node = ((VariableInitializer)node).NameToken;
            }

            if (node is IdentifierExpression)
            {
                node = ((IdentifierExpression)node).IdentifierToken;
            }

            var region = new DomRegion(fileName, node.StartLocation, node.EndLocation);

            var length = node is PrimitiveType ? keywordName.Length : node.EndLocation.Column - node.StartLocation.Column;

            return(new MemberReference(valid, region, editor.LocationToOffset(region.Begin), length));
        }
 public string GetIndentationString(int lineNumber, int column)
 {
     return(GetIndentationString(data.LocationToOffset(lineNumber, column), new DocumentLocation(lineNumber, column)));
 }
		public static string ResolveExpression (TextEditorData editor, ResolveResult result, AstNode node, out int startOffset)
		{
			//Console.WriteLine ("result is a {0}", result.GetType ().Name);
			startOffset = -1;

			if (result is NamespaceResolveResult ||
			    result is ConversionResolveResult ||
			    result is ConstantResolveResult ||
			    result is ForEachResolveResult ||
			    result is TypeIsResolveResult ||
			    result is TypeOfResolveResult ||
			    result is ErrorResolveResult)
				return null;

			if (result.IsCompileTimeConstant)
				return null;

			startOffset = editor.LocationToOffset (node.StartLocation.Line, node.StartLocation.Column);

			if (result is InvocationResolveResult) {
				var ir = (InvocationResolveResult) result;
				if (ir.Member.Name == ".ctor") {
					// if the user is hovering over something like "new Abc (...)", we want to show them type information for Abc
					return ir.Member.DeclaringType.FullName;
				}

				// do not support general method invocation for tooltips because it could cause side-effects
				return null;
			} else if (result is LocalResolveResult) {
				if (node is ParameterDeclaration) {
					// user is hovering over a method parameter, but we don't want to include the parameter type
					var param = (ParameterDeclaration) node;

					return GetIdentifierName (editor, param.NameToken, out startOffset);
				}

				if (node is VariableInitializer) {
					// user is hovering over something like "int fubar = 5;", but we don't want the expression to include the " = 5"
					var variable = (VariableInitializer) node;

					return GetIdentifierName (editor, variable.NameToken, out startOffset);
				}
			} else if (result is MemberResolveResult) {
				var mr = (MemberResolveResult) result;

				if (node is PropertyDeclaration) {
					var prop = (PropertyDeclaration) node;
					var name = GetIdentifierName (editor, prop.NameToken, out startOffset);

					// if the property is static, then we want to return "Full.TypeName.Property"
					if (prop.Modifiers.HasFlag (Modifiers.Static))
						return mr.Member.DeclaringType.FullName + "." + name;

					// otherwise we want to return "this.Property" so that it won't conflict with anything else in the local scope
					return "this." + name;
				}

				if (node is FieldDeclaration) {
					var field = (FieldDeclaration) node;
					var name = GetIdentifierName (editor, field.NameToken, out startOffset);

					// if the field is static, then we want to return "Full.TypeName.Field"
					if (field.Modifiers.HasFlag (Modifiers.Static))
						return mr.Member.DeclaringType.FullName + "." + name;

					// otherwise we want to return "this.Field" so that it won't conflict with anything else in the local scope
					return "this." + name;
				}

				if (node is VariableInitializer) {
					// user is hovering over a field declaration that includes initialization
					var variable = (VariableInitializer) node;
					var name = GetIdentifierName (editor, variable.NameToken, out startOffset);

					// walk up the AST to find the FieldDeclaration so that we can determine if it is static or not
					var field = variable.GetParent<FieldDeclaration> ();

					// if the field is static, then we want to return "Full.TypeName.Field"
					if (field.Modifiers.HasFlag (Modifiers.Static))
						return mr.Member.DeclaringType.FullName + "." + name;

					// otherwise we want to return "this.Field" so that it won't conflict with anything else in the local scope
					return "this." + name;
				}

				if (node is NamedExpression) {
					// user is hovering over 'Property' in an expression like: var fubar = new Fubar () { Property = baz };
					var variable = node.GetParent<VariableInitializer> ();
					if (variable != null) {
						var variableName = GetIdentifierName (editor, variable.NameToken, out startOffset);
						var name = GetIdentifierName (editor, ((NamedExpression) node).NameToken, out startOffset);

						return variableName + "." + name;
					}
				}
			} else if (result is TypeResolveResult) {
				return ((TypeResolveResult) result).Type.FullName;
			}

			return editor.GetTextBetween (node.StartLocation, node.EndLocation);
		}
		static string GetIdentifierName (TextEditorData editor, Identifier id, out int startOffset)
		{
			startOffset = editor.LocationToOffset (id.StartLocation.Line, id.StartLocation.Column);

			return editor.GetTextBetween (id.StartLocation, id.EndLocation);
		}
		public string ResolveExpression (TextEditorData ed, Document doc, int offset, out int startOffset)
		{
			startOffset = offset;
			var editorData = DResolverWrapper.CreateEditorData(doc);
			if (editorData == null)
				return null;
			editorData.CaretOffset = offset;
			var edLoc = ed.OffsetToLocation(offset);
			editorData.CaretLocation = new CodeLocation(edLoc.Column,edLoc.Line);

			var o = DResolver.GetScopedCodeObject(editorData);
			if (o != null) {
				startOffset = ed.LocationToOffset (o.Location.Line, o.Location.Column);
				if (o is INode)
					return (o as INode).Name;
				return o.ToString ();
			}

			return null;
		}