I am currently writing a ReSharper 6 Plugin that should add Warnings
to my IDE. These are read from an XML file with a LineNumber and other data.
So far I have created an IDaemonStage
with ErrorStripeRequest.STRIPE_AND_ERRORS
and a IDaemonStageProcess
. This works and gets executed so far.
Problem is: The Warnigns don't get added to my IDE.
How do I get the correct TextRange and DocumentRange?
In my Execute()
I have this:
var violations = new List<HighlightingInfo>();
foreach (var error in errorsFromXML)
{
// assignments here
int lineNumber = 172; // example
string ruleId;
string rule;
string error;
rule = ruleId + ":" + rule;
// I guess this is what's wrong
var lineNumber =
JetBrains.Util.dataStructures.TypedIntrinsics.Int32<DocLine>.Parse(
linumber.ToString());
int start = daemonProcess.Document.GetLineStartOffset(lineNumber);
int end = daemonProcess.Document.GetLineEndOffsetNoLineBreak(lineNumber);
var textRange = new JetBrains.Util.TextRange(start, end);
var range = new JetBrains.DocumentModel.DocumentRange(
daemonProcess.Document, textRange);
// range.ToString() => (DocumentRange (6.253 - 6.262) on <WrongThread>) // example
// and this should be fine again
var highlight = new TqsHighlight(rule, error);
violations.Add(new HighlightingInfo(range, highlight, Severity.WARNING, rule + id));
}
return violations; // returns various violations
Also I have a Custom Highlight Class:
internal class TqsHighlight : IHighlighting
{
private readonly string error;
private readonly string rule;
public TqsHighlight(string rule, string error)
{
this.rule = rule;
this.error = error;
}
public bool IsValid()
{
return true;
}
public string ToolTip
{
get
{
return this.error;
}
}
public string ErrorStripeToolTip
{
get
{
return this.rule;
}
}
public int NavigationOffsetPatch
{
get
{
return 0;
}
}
}
The TextRange
constructor actually takes an offset, which is probably not what you want. What you need to do instead is to call a few methods on daemonProcess.Document
. Namely, if you call GetLineStartOffset()
and GetLineEndOffsetNoLineBreak()
this will get you the start and end of the line. You can cast an ordinary int
to the required parameter type. Then, you can use these results to create a TextRange
(use the constructor that takes both startOffset
and endOffset
) and, subsequently, a DocumentRange
.
Hope this fixes the problem. Let me know if I can be of further help.