programing

사용자 지정 컴파일러 경고

telecom 2023. 5. 20. 10:05
반응형

사용자 지정 컴파일러 경고

에서 사용되지 않는 특성을 사용하는 경우.Net은 객체/메소드/속성이 구식이므로 다른 것을 사용해야 한다는 컴파일러 경고를 제공합니다.저는 현재 전직원 코드 리팩터링 작업이 많이 필요한 프로젝트를 진행하고 있습니다.내가 작성한 메시지를 제공하는 컴파일러 경고를 생성하는 메서드나 속성을 표시하는 데 사용할 수 있는 사용자 지정 특성을 작성하고 싶습니다.이런 거.

[MyAttribute("This code sux and should be looked at")]
public void DoEverything()
{
}
<MyAttribute("This code sux and should be looked at")>
Public Sub DoEverything()
End Sub

나는 이것이 "이 코드는 sex이고 봐야 한다"라는 컴파일러 경고를 생성하기를 원합니다.사용자 지정 속성을 만드는 방법을 알고 있습니다. 문제는 비주얼 스튜디오에서 컴파일러 경고를 생성하는 방법입니다.

이것은 시도해 볼 가치가 있습니다.

사용되지 않음을 확장할 수 없습니다. 최종 사용자이기 때문입니다. 하지만 사용자 고유의 속성을 생성하여 다음과 같이 해당 클래스를 사용되지 않음으로 표시할 수 있습니다.

[Obsolete("Should be refactored")]
public class MustRefactor: System.Attribute{}

그런 다음 "MustRefactor" 속성으로 메서드를 표시하면 컴파일 경고가 표시됩니다.컴파일 시간 경고를 생성하지만 오류 메시지가 이상하게 보이므로 직접 보고 선택해야 합니다.이것은 당신이 성취하고자 했던 것에 매우 가깝습니다.

업데이트: 이 코드를 사용하면 경고가 발생합니다(별로 좋지는 않지만 더 나은 것은 없는 것 같습니다).

public class User
{
    private String userName;

    [TooManyArgs] // Will show warning: Try removing some arguments
    public User(String userName)
    {
        this.userName = userName;   
    }

    public String UserName
    {
        get { return userName; }
    }
    [MustRefactor] // will show warning: Refactor is needed Here
    public override string ToString()
    {
        return "User: " + userName;
    }
}
[Obsolete("Refactor is needed Here")]
public class MustRefactor : System.Attribute
{

}
[Obsolete("Try removing some arguments")]
public class TooManyArgs : System.Attribute
{

}

일부 컴파일러에서는 #warning을 사용하여 경고를 실행할 수 있습니다.

#warning "Do not use ABC, which is deprecated. Use XYZ instead."

마이크로소프트 컴파일러에서는 일반적으로 다음과 같은 메시지를 사용할 수 있습니다.

#pragma message ( "text" )

말씀하셨잖아요.넷, 그러나 C/C++로 프로그래밍하는지 C#으로 프로그래밍하는지 지정하지 않았습니다.C#으로 프로그래밍하는 경우 C#이 #warning 형식을 지원한다는 것을 알아야 합니다.

우리는 현재 모든 것을 바로 고칠 수 없는 많은 리팩터링 작업 중입니다.#warning preproc 명령을 사용하여 코드를 확인합니다.컴파일러 출력에 표시됩니다.메소드에 올릴 수는 없을 것 같은데 메소드 바로 안쪽에 넣을 수도 있고, 그래도 찾기 쉽습니다.

public void DoEverything() {
   #warning "This code sucks"
}

갱신하다

이것은 이제 Roslin(Visual Studio 2015)을 통해 가능합니다.코드 분석기를 빌드하여 사용자 지정 특성을 확인할 수 있습니다.


원래 오래된 답변:

저는 그것이 가능하다고 생각하지 않습니다.OversideAttribute는 컴파일러에서 특별히 처리되며 C# 표준에 정의되어 있습니다.사용되지 않는 속성을 허용할 수 없는 이유는 무엇입니까?제가 보기에 이것은 정확히 그것이 목적으로 설계된 상황이고, 당신이 요구하는 것을 정확하게 달성하는 것 같습니다!

또한 Visual Studio는 사용되지 않는 특성에 의해 생성된 경고도 즉시 수집하므로 매우 유용합니다.

도움이 안 될 생각은 없습니다. 그냥 왜 그걸 사용하지 않는지 궁금할 뿐입니다.

안타깝게도 사용되지 않는 특성은 봉인되어 있으므로(일부는 특수 처리로 인해) 사용자 자신의 특성을 하위 분류할 수 없습니다.

C# 표준에서:-

사용되지 않음 특성은 더 이상 사용해서는 안 되는 유형 및 유형의 멤버를 표시하는 데 사용됩니다.

프로그램에서 사용되지 않는 특성으로 장식된 유형 또는 멤버를 사용하는 경우 컴파일러는 경고 또는 오류를 발생시킵니다.특히 컴파일러는 오류 매개 변수가 제공되지 않거나 오류 매개 변수가 제공되고 값이 false인 경우 경고를 발생시킵니다.오류 매개 변수가 지정되고 값이 true이면 컴파일러가 오류를 발생시킵니다.

그게 당신의 욕구를 요약하는 것 아닌가요? ... 당신은 내가 생각하지 않는 것보다 더 잘 할 수 없을 것입니다.

당신이 하려는 것은 속성의 오용입니다.대신 Visual Studio 작업 목록을 사용합니다.코드에 다음과 같은 주석을 입력할 수 있습니다.

//TODO:  This code sux and should be looked at
public class SuckyClass(){
  //TODO:  Do something really sucky here!
}

그런 다음 메뉴에서 보기 / 작업 목록을 엽니다.작업 목록에는 사용자 작업과 주석의 두 가지 범주가 있습니다.주석으로 전환하면 모든 //작업관리:가 표시됩니다.TODO를 두 번 클릭하면 코드의 주석으로 이동합니다.

VS 2008(+sp1)에서 Clean Soultion & Rebuild Solution 후 오류 목록에 경고가 제대로 표시되지 않습니다. 모든 경고는 표시되지 않습니다.일부 경고는 특정 클래스 파일을 연 후에만 오류 목록에 표시됩니다.그래서 어쩔 수 없이 사용자 지정 특성을 사용했습니다.

[Obsolete("Mapping ToDo")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]
public class MappingToDo : System.Attribute
{
    public string Comment = "";

    public MappingToDo(string comment)
    {
        Comment = comment;
    }

    public MappingToDo()
    {}
}

그래서 내가 그것으로 어떤 코드를 표시할 때.

[MappingToDo("Some comment")]
public class MembershipHour : Entity
{
    // .....
}

다음과 같은 경고가 발생합니다.

네임스페이스입니다.MappingToDo가 더 이상 사용되지 않습니다. 'MappingToDo'.

경고의 텍스트를 변경할 수 없습니다. '일부 주석'이 오류 목록으로 표시되지 않습니다.하지만 그것은 파일의 적절한 위치로 점프할 것입니다.따라서 이러한 경고 메시지를 변경해야 하는 경우 다양한 특성을 생성합니다.

여기 Roslyn 구현이 있으므로 경고 또는 오류를 즉시 제공하는 고유한 특성을 만들 수 있습니다.

TypeCalled IdeMessage경고를 생성하는 속성이 됩니다.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class IDEMessageAttribute : Attribute
{
    public string Message;

    public IDEMessageAttribute(string message);
}

이렇게 하려면 먼저 Roslin SDK를 설치하고 Analyzer를 사용하여 새 VSIX 프로젝트를 시작해야 합니다.메시지와 같이 관련성이 낮은 부분을 일부 생략했습니다. 어떻게 해야 하는지 알 수 있습니다.분석기에서 다음을 수행합니다.

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(AnalyzerInvocation, SyntaxKind.InvocationExpression);
}

private static void AnalyzerInvocation(SyntaxNodeAnalysisContext context)
{
    var invocation = (InvocationExpressionSyntax)context.Node;

    var methodDeclaration = (context.SemanticModel.GetSymbolInfo(invocation, context.CancellationToken).Symbol as IMethodSymbol);

    //There are several reason why this may be null e.g invoking a delegate
    if (null == methodDeclaration)
    {
        return;
    }

    var methodAttributes = methodDeclaration.GetAttributes();
    var attributeData = methodAttributes.FirstOrDefault(attr => IsIDEMessageAttribute(context.SemanticModel, attr, typeof(IDEMessageAttribute)));
    if(null == attributeData)
    {
        return;
    }

    var message = GetMessage(attributeData); 
    var diagnostic = Diagnostic.Create(Rule, invocation.GetLocation(), methodDeclaration.Name, message);
    context.ReportDiagnostic(diagnostic);
}

static bool IsIDEMessageAttribute(SemanticModel semanticModel, AttributeData attribute, Type desiredAttributeType)
{
    var desiredTypeNamedSymbol = semanticModel.Compilation.GetTypeByMetadataName(desiredAttributeType.FullName);

    var result = attribute.AttributeClass.Equals(desiredTypeNamedSymbol);
    return result;
}

static string GetMessage(AttributeData attribute)
{
    if (attribute.ConstructorArguments.Length < 1)
    {
        return "This method is obsolete";
    }

    return (attribute.ConstructorArguments[0].Value as string);
}

솔루션에서 제거할 수 있는 CodeFixProvider가 없습니다.

난 네가 할 수 있다고 생각하지 않아.내가 알기로는 OsnoteAttribute에 대한 지원은 기본적으로 C# 컴파일러에 하드 코딩되어 있습니다. 당신은 이와 유사한 것을 직접 할 수 없습니다.

방금 컴파일된 어셈블리에 대해 사용자 지정 도구를 실행하는 MSBuild 작업(또는 빌드 후 이벤트)을 사용할 수 있습니다.사용자 지정 도구는 어셈블리의 모든 유형/방법을 반영하고 사용자 지정 속성을 사용하며, 이때 시스템으로 인쇄할 수 있습니다.콘솔의 기본값 또는 오류 TextWriters입니다.

Osled Attribute의 소스를 보면 컴파일러 경고를 생성하기 위해 특별한 작업을 하는 것처럼 보이지 않기 때문에 @technophile로 진행하여 컴파일러에 하드 코딩되어 있다고 말하는 경향이 있습니다.사용되지 않는 특성을 사용하여 경고 메시지를 생성하지 않으려는 이유가 있습니까?

경고나 프래그마를 삽입할 것을 제안하는 몇 가지 의견이 있습니다.구식은 매우 다른 방식으로 작동합니다!L 라이브러리의 함수를 사용하지 않음으로 표시하면 호출자 프로그램이 L 라이브러리에 없더라도 프로그램이 함수를 호출하면 사용하지 않음 메시지가 표시됩니다. L 라이브러리가 컴파일된 경우에만 경고 메시지가 표시됩니다.

언급URL : https://stackoverflow.com/questions/154109/custom-compiler-warnings

반응형