문제

의 편집자와 Ide 있는 코드를 완료합니다.그들 중 일부는 매우"지적인"다른 사람은 정말 없습니다.나에 관심이 더 지능형 유형입니다.예를 들어 본 Ide 만을 제공하는 함수의 경우)에서 유효한 현재 범위 b)반환 값은 유효합니다.(예를 들어 후"5+foo[탭]"그것만 제공하는 반환하는 함수가 추가될 수 있는 정수 또는 변수의 이름을 올바른 형식입니다.) 도 내가 보았는 장소는 더 많은 자주 사용되거나 긴 옵션을 앞두의 목록입니다.

나는 필요성을 깨닫게 분석합니다.그러나 일반적으로 편집하는 동안 현재의 코드의 잘못된 구문 오류가 있습니다.당신은 어떻게 분석 뭔가를 할 때 그것은 불완전하고 오류가 포함되어?

또한 시간이 제한이었습니다.완료 쓸모 없는 경우에 그것은 초고 올 목록입니다.때로는 알고리즘을 완료들과 함께 수천 개의 클래스입니다.

무엇이 좋은 알고리즘과 데이터 구조에 대한 이?

도움이 되었습니까?

해결책

합될 수 내 UnrealScript 언어로 서비스 제품은 복잡,하지만 저는 주로 최 개요 여기로 내가 할 수 있습니다.C#언어로 서비스에 VS2008SP1 은 나의 성능 목표는(좋은 이유가).그것은 아직 존재하지 않지만,그것은 빠른/정확한 충분할 수 있는 안전하게 제안을 한 후 하나의 문자 입력을 기다리지 않고,ctrl+공간 또는 사용자 입력 . (dot).더 많은 정보는 사람의 취향과 성격이 만들어내는 작업 언어에서비스]get 이 주제에 대해 더 나은,최종 사용자 경험을 얻어야 나는 이제까지 자신들의 제품을 사용.의 수 있는 제품이 들었어요 불행한 경험의 작업을 지불하지 않은 이러한주의해보고,그 결과로 나과 싸우고 있었다 IDE 보다 더 나는 코딩이다.

나의 언어로 서비스,그것은 뻗어있는 다음과 같:

  1. 을 얻을 표현에 커서입니다.이 산책의 시작 부분에서 회원 식 액세스 의 끝 식별자 커서가 끝났습니다.회원 식 액세스는 일반적으로 형식 aa.bb.cc, 지만,포함할 수도 있습 방법으로서 aa.bb(3+2).cc.
  2. 을 얻 컨텍스트 주변 커서입니다.이것은 매우 까다롭지 않기 때문에 항상 따라 동일한 규칙으로 컴파일러(긴 이야기)그러나 여기에다고 가정합니다.일반적으로 이것을 얻을 캐시된 정보에 대한 메서드/클래스 커서가 있습니다.
  3. 말 컨텍스트를 구현하는 객체 IDeclarationProvider, 할 수 있는 통화 GetDeclarations() 을 얻 IEnumerable<IDeclaration> 모든 항목의 표시 범위에서.나의 케이스에서,이 목록에 포함되어 지역/매개변수(는 경우에는 방식),회원(분야와 방법,정체되는 경우에는 인스턴스 방법,그리고 개인의 회원 기본 형식),globals(형식과 상수의 언어에서 일하고 있어요)및 키워드가 있습니다.이 목록의 것 항목 이름 aa.첫 번째 단계로 평가하는 표현에서 1 위,우리가 선택 항목의 컨텍스트에서 열거한 이름으로 aa, 제공하는 IDeclaration 다음 단계입니다.
  4. 다음으로,적용하는 연산자 IDeclaration 을 나타내는 aa 을 얻을 다른 IEnumerable<IDeclaration> 을 포함하는"회원"(어떤 의미에서)의 aa.이후 . 운영자가 다른 -> 연산자,나는 통화 declaration.GetMembers(".") 과 기대 IDeclaration 체를 올바르게 적용된 연산자입니다.
  5. 이 때까지 계속 나중 cc, 는 선언 목록 지 않을 수도 있습 을 포함하는 객체 이름 cc.나는 당신이 알고 있는 경우에,여러 개의 항목으로 시작 cc, 그들은 나타나야 합니다.저는 이 문제를 해결하여 최종 열거하고를 통해 전달하는 내 문서화 알고리즘 사용자에게 제공하는 가장 유용한 정보 가능합니다.

여기에 몇 가지 추가사항에 대한 상속될 백엔드:

  • 나는 광범위하게 사용 LINQ 의 게으른 평가 메커니즘을 구현하는 GetMembers.각 객체 내에서 캐쉬할 수 있을 제공하는 함수를 평가하는 회원에게,그래서 수행하는 복잡한 작업은 나무 가까 하는 것입니다.
  • 대신하는 각 개체의 유지 List<IDeclaration> 의 멤버로 유지 List<Name>, 디 Name 는 구조체를 포함하는 해시의 특 형식 문자열을 설명하는 회원에게 있습니다.가 엄청난 캐시지도에 이름을 개체입니다.이 방법을 때,다시 구문 분석 파일을 제거할 수 있는 모든 항목을 선언서에서 파일을 캐시고 다시는 그것으로 업데이트 회원입니다.방식 때문에 함수가 구성되는 모든 표현을 즉시를 평가하는 새로운 항목입니다.

IntelliSense"프"

으로 사용자 형식의 파일 구문 잘못된 보다 더 자주 그것은 올바른 것입니다.이와 같이 내가 원하지 않을 우연히 섹션을 제거 캐시 사용자가 형식입니다.나는 수가 많은 특별한 경우에는 규칙을 처리하기 위해 증분 업데이트한 가능한 한 빨리합니다.의 증가 캐시에 로컬로 저장하는 파일 열기는지 확인하는 데 도움이됩니 지키는 사용하지 않는 것을 깨닫는 자신의 입력을 일으키는 backend 캐시을 잡아 잘못된 라인/열 정보 같은 것들에 대한 각 방법에서 파일입니다.

  • 하나 구속하는 요인은 나서 파 fast.그것은 처리할 수 있는 전 캐시 업데이트 20000 라인 소스 파일에서 150ms 운영하면서 자체에 포함된 우선순위가 낮은 백그라운드 스레드.때마다 이 파서 완료 전에 열려 있는 파일을 성공적으로(구문),현재 상태의 파일로 이동하는 글로벌 캐시입니다.
  • 파일이 아닌 경우 통상적으로 올바른,사용 ANTLR 필터를 파서(미안에 대한 링크-가장 정보가 메일링리스트 또는에서 수집한 독서 원본) 석하는 파일을 찾:
    • 변수 필드 선언이 있습니다.
    • 의 서명을 클래스/구조체 정의입니다.
    • 서명한 방법을 정의입니다.
  • 에서 로컬 캐시 클래스/구조/방법을 정의에서 시작하고 서명될 때까지 버팀대 중첩 수준으로 돌아갑니다.방법은 또한 끝나면 다른 방법을 선언에 도달(어떤 방법 중첩).
  • 로컬 캐시에 변수 필드를 연결하는 즉시 이전 닫히지 요소입니다.참 간단한 코드는 아래의 예는 왜 이것은 중요합니다.
  • 또한 사용자 유형,유지 매핑 테이블을 표시하는 추가/제거할 문자 범위를 다룹니다.이를 위해 사용:
    • 확인에 나가 확인할 수 있는 올바른 컨텍스트의 커서,이후 방법도 있는 이동 파일 사이의 전체를 구문 분석.
    • 어야 만들기 선언으로 이동/정의/참조 찾은 항목에서 올바르게 파일이 열려 있습니다.

코드는 이전 섹션:

class A
{
    int x; // linked to A

    void foo() // linked to A
    {
        int local; // linked to foo()

    // foo() ends here because bar() is starting
    void bar() // linked to A
    {
        int local2; // linked to bar()
    }

    int y; // linked again to A

나는 나의 목록을 추가 상속될 기능을 구현한 이 레이아웃이 있습니다. 의 사진을 각 여기에 있습니다.

  • 자동 완성
  • 도구
  • 방법 팁
  • 클래스 보기
  • 코드 정의 창
  • Call 브라우저(VS2010 마지막으로 추가 이용하여 C#)
  • 의미가 올바른 모든 참조 찾기

다른 팁

내가 말할 수 없을 정확히 무엇을 알고리즘을 사용하여 어떤 특정 구현,하지만 내가 만들 수 있는 몇 가지 추측.A 은 매우 유용한 데이터 구조에 대한 이 문제는:IDE 을 유지할 수 있는 대형 기술을 사용하여 메모리에 상징의 모든 프로젝트에서 몇 가지 추가 메타데이터에서는 각 노드입니다.

입력할 때 문자,그것은 산책 길에서 라.모두의 자손의 특정 라는 노드가 가능 달성 횟수를 확인할 수 있습니다.그런 다음 IDE 구 필터를 사람들에 의해 사람을 의미가 있는 현재 상황에서,하지만 그것은 단지 요구를 계산하는 많은으로 표시될 수 있습 탭에서 완성 팝업 창을 엽니다.

고급되지 요구는 더 복잡한 라.예를 들어, Visual 지원 X 는 기능이 그것에 의하여 당신은 단지 입력할 필요가자의 서로 다른 상징-예를 들어를 입력할 경우,SFN,그것은 당신을 보여줍호 SomeFunctionName 에 해당 탭을 완성 창입니다.

컴퓨팅 기술을 사용하여(또는 다른 데이터 구조)이 필요로 구문 분석의 모든 코드를 얻을 모두의 목록의 상징에서 귀하의 프로젝트입니다.Visual Studio 점 이에 IntelliSense 데이터베이스 .ncb 저장된 파일와 함께 귀하의 프로젝트지 않도록을 재분석 모든 것 모든 시간을 닫고 다시 프로젝트입니다.처음 열리는 대규모 프로젝트를(예를 들어,하나 당신은 단지 동기화된 형태원 제어),VS 시간이 걸릴 것입니다을 분석하 모든 것을 생성하는 데이터베이스입니다.

나도 몰라 처리하는 방법을 변경 됩니다.당신이 말했듯이,당신이 쓰기 코드의 잘못된 구문 90%시간의,그리고 다시 구문 분석 과 모든 것을 할 때마다 당신이 차질을 빚을 것이 큰 세금에 대해 CPU 매우 작은 혜택을 경우에 특히 수정하는 헤더 파일을 포함하여 큰 숫자의 소스 파일이 있습니다.

내가 심는 것 중 하나는(a)만 reparses 할 때마다 실제로 구축 프로젝트(가능하게 할 때 당신은 가까운/그것을 열고)또는(b)가 그것이 어떤 종류의 지역 분석는 곳에 그것은 단지 구문 분석하는 코드의 주위에 당신은 단지 편집에서 일부 제한 패션,단지의 이름을 얻 관련 기호입니다.이후 C++같은 뛰어나게 복잡한 문법,그것은 이상하게 동작할 수 있습에 어두운 모서리를 사용할 경우 무거운 템플릿과 메타 프로그래밍과 같습니다.

다음 링크가 더 도움이 될 것입니다 ..

구문 강조 표시 :구문 강조 표시를위한 빠른 색상 텍스트 상자

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top