Подавить предупреждение компилятора 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, например, библиотеки, работающие с веб-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
Это потому, что вы смотрите в окно ошибок, а не в вывод сборки. Чтобы получить реальный результат сборки, выберите «Просмотр» - ›« Вывод », а затем выберите« Сборка »в раскрывающемся списке. - 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