2012-11-29 3 views
2

유효하지 않을 수있는 교차 참조가 포함 된 문법을 작성해야합니다. 즉, 존재하지 않는 대상을 가리 킵니다. 그러한 참조를 포함하는 파일은 오류가 아니라 경고 만 가져야합니다. 발전기는 이것을 특별한 경우처럼 처리합니다.XText : 유효하지 않은 상호 참조 허용

XText로 어떻게 할 수 있습니까?

답변

5

EMF에서 존재하지 않는 대상에 대한 유효한 상호 참조를 만들 수 없습니다.

내가 대신 EReferences의 EAttributes와 함께 갈 제안 :

  • 변경 기능 = [ECLASS | ID] 기능 에 의한 = {YourDSL} 문법 ID.
  • {YourDSL} ScopeProvider 클래스의 * scope_EClass_feature (context, reference) * 메소드에서와 같이 범위 계산 유틸리티를 제공하십시오. 이 범위 지정 메소드는 주어진 참조의 eType을 단순히 사용하기 때문에 다시 구현하는 것은 간단해야합니다.
  • {YourDSL} ProposalProvider에서이 범위 계산 유틸리티를 사용하여 도입 된 EAttribute의 값을 제안하십시오.
  • 유효성 검사 규칙에서이 유틸리티를 사용하여 "유효"하지 않은 경우이 EAttribute에 경고/정보를 추가 할 수 있습니다 (선택 사항).
  • 마지막으로 생성기에서 유틸리티를 사용하여 유효한 대상 eObject를 기반으로 출력을 만듭니다.
1

DSL을 만들 때 전환 문제가 발생하지 않는 언어에 대한 변수의 암호를 제공하기 위해이 문제가 발생했습니다. 이 방법은 효과가 있지만, 실제로 그 불쾌한 참조를 원한다면 스스로에게 자문 해보십시오.

UI 모듈 에만 만 자동 생성 오류를 표시 할 수 있습니다. YourReference에 대한 모든 링커 오류가 누락 될

class DSLLinkingDiagnosticMessageProvider extends LinkingDiagnosticMessageProvider { 
    override getUnresolvedProxyMessage(ILinkingDiagnosticContext context) { 
     if(context.context instanceof YourReference) { 
      // return null so the your error is left out 
      null 
     } else { 
      // use super implementation for others 
      super.getUnresolvedProxyMessage(context) 
     } 
    } 
} 

이렇게하려면 기능 getUnresolvedProxyMessageILinkingDiagnosticMessageProvider을 제공하고보다 우선합니다. 그러나 모든 거짓 요소가 null 인 더미 참조 객체가 있다는 것을 알아 두십시오. Exspecialy 이름은 분실되고 당신은 CyclicLinkingException 때문에 그것을 놓을 수 없다. 그러나 이름을 직접 설정하는 새로운 방법을 만들 수 있습니다.

더미 개체에는 사용자가 입력 한 형식이 있습니다. 초록이 있으면 마녀 참고를 쉽게 확인할 수 있습니다.