Потискане на F# компилатор Предупреждение: Възможен неправилен отстъп: този токен е извън контекста

Имам някои xunit тестове, които бих искал да оформя по следния начин за четимост:

[<Fact>] let ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2
[<Fact>] let ``ToString yields two``()      = target.ToString().ShouldBe "two"
[<Fact>] let ``Has underlysing type int``() = target.GetUnderlyingType().ShouldBe typeof<int>

Получавам предупреждение на компилатора за операторите let: „Възможен неправилен отстъп: този токен е извън контекста, започнал в позиция %s. Опитайте да добавите отстъп към този токен или да използвате стандартни конвенции за форматиране.“

Опитах #nowarn "lexfltTokenIsOffsideOfContextStartedEarlier", но това просто генерира друго предупреждение на компилатора „Невалиден предупредителен номер“.

Няма посочен предупредителен номер за тази грешка в https://github.com/fsharp/fsharp/blob/057dbf77df7355321c3c18137c2d552bdfa1272b/src/fsharp/FSComp.txt

Има ли начин да потисна това предупреждение?


person Craig    schedule 15.05.2015    source източник


Отговори (2)


Извинявам се, че отговарям в стил "не ти трябва", но май е така. Освен това този въпрос очевидно се превръща в често задаван въпрос за тези, които пишат модулни тестове на F#. Още един случай е за [<Literal>].

Както и да е, деактивирането на предупреждения на ниво проект или дори на ниво файл изглежда е лоша идея, освен ако нямате основателна причина да го направите.

Доколкото разбрах, бихте искали изразите да са едноредови (напр. [<Fact>] не заема цял ред). Има два начина да постигнете това във VS2013:

  1. Поставете атрибута вътре в let:

    let [<Fact>] ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2
    
  2. Напишете двойна точка и запетая след декларацията:

    [<Fact>] let ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2;;
    
person bytebuster    schedule 16.05.2015
comment
Благодаря ти. Избрах вашия вариант 1. Радвам се да чуя, че има начин да го направите, без да деактивирате предупрежденията. - person Craig; 17.05.2015
comment
Тъкмо започвам да пиша модулни тестове на F# на базата на C# код като начин да науча F# и да пиша по-кратки и четливи тестове. Бихте ли обяснили какво имате предвид под Още един случай е за [‹Literal›]? Бихте ли също така препоръчали публикации/статии със съвети за начинаещи в F# модулни тестове? - person Craig; 17.05.2015
comment
@Craig, например, библиотеките, работещи с Web API, често пазят много твърдо кодирани константи, напр. частични URL адреси, числови стойности и т.н. Те обикновено са маркирани с атрибут [<Literal>] като описани в MSDN. Ако има много от тях, програмистът може също да иска те да са едноредови, точно по същия начин във вашия въпрос, и те ще имат абсолютно същия проблем (забележка: MSDN статията има атрибута в отделен ред!) . Споменах го в отговора си, така че някой, който търси решение в мрежата, да намери този отговор. - person bytebuster; 17.05.2015

Опитайте тази:

#nowarn "0058"

За да разберете кой е правилният предупредителен номер, просто изградете нещото в командния ред (или във VS и след това отидете на View -> Output -> Build), то ще ви каже. Ето какво виждам:

Program.fs(7,3): warning FS0058: Possible incorrect indentation: this token is offside of context started at position (5:25). Try indenting this token further or using standard formatting conventions.
person Fyodor Soikin    schedule 16.05.2015
comment
Благодаря ти. По някаква причина не получавам частта от текстовото предупреждение FS0058: показано в изхода ми за компилация. - person Craig; 17.05.2015
comment
Това е така, защото гледате в прозореца за грешки, а не в изхода на компилацията. За да стигнете до реалния изход за компилация, отидете на View -› Output и след това изберете Build в падащото меню. - person Fyodor Soikin; 17.05.2015
comment
Страхотен. Благодаря. Виждам го там. - person Craig; 17.05.2015
comment
Гледайки в изхода за компилация, мога да видя ред в червено 4> C:\Program Files (x86)\Microsoft SDKs\F#\3.1\Framework\v4.0\fsc.exe -o:obj\Debug\TestFastLibValueObj.dll -g --debug:full --noframework --define:DEBUG --define:TRACE --doc:bin\Debug\TestFastLibValueObj.XML --optimize- --tailcalls- -r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.1.0\FSharp.Core.dll" -r:C:\Users\azuretools\Documents\GitHub\TaPrivate\CoreComponents\bin\Debug\LibBase.dll - и т.н. Въпреки това не изглежда да дава конкретна грешка и компилацията е завършена успешно. Мога ли да го игнорирам? - person Craig; 17.05.2015