구조화된 검색 교체

 

섹션은 복잡하지만 매우 강력한 구성 요소를 이용하는 것을 당신이 시작하는 것을 지원하는 유용한 개의 Usecases 제공할 뿐만 아니라 Structured Search&Replace 특징, 기능, 통제를 기술합니다.


Structured Search&Replace  당신이 검색하는 것을 가능하게 하고, 필요하다면 패턴을 사용하여 자바 코드의 조각을 교체하기 위해 사용하고 있는 자바-인식이 있는 검색 교체 메커니즘입니다.

실제로 Structured Search&Replace 2 다이얼로그를 포함합니다.   번째는 패턴을 사용하고 있는 자바 코드 내에서 검색하는 Structural Search 입니다.  그것은 Search | Search structurally  거나 Ctrl + Shift + S 눌러서 불려질 있습니다그것은 패턴과 함께 자바 코드를 위해 검색하기 위해 사용됩니다.



다른 것은 패턴을 사용하고 있는 자바 코드를 검색하고, 교체하는 Structural Replace입니다.  그것은 Search | Replace structurally 선택하거나 Ctrl + Shift + M 눌러서 불려집니다.



다이얼로그는 공통의 로트를 가지고, Structured Search&Replace 위해 필요한 추가와 함께 기술될 것입니다.

 

다이얼로그의 주요 부분은 Search template Search template/Replacement template 입니다.  그들은 일치하는 패턴을 검색하거나 교체하는 사용하는 템플릿을 포함합니다. 각각의 Search 템플릿은 클래스/인터페이스/스테이트먼트/스테이트먼트 세트/표현식/코멘트/Javadoc 코멘트 라고 가정하 각각의 Replace 템플릿은 자바 관점에서 정확한 구문과 함께 스테이트먼트/스테이트먼트 세트/표현식이 되는 것으로 가정합니다. 그리고 템플릿 내의 어떤 이름이라도 변수와 함께 치환될 있습니다.  변수는 $ 기호 내에 써지는 이름입니다. 예를 들면, $Variable$ 입니다.  IDEA 생성된 템플릿을 분석하고 패턴은 정확한 자바 구문을 가져야만 한다라는 정확한 검색 결과를 얻기 위해 자바 인식의 엔진을 사용합니다.


Replacement template  Search template에서 사용되는 변수만을 포함할 있습니다.



템플릿을 쓰면서, 개의 단축키를 이용할 있습니다:

*   메소드 보디는 생략될 있습니다.

*   만일 어떤 접근 경자 표시되지 않으면, 어떤 접근 변경자라도 존중 받을 것입니다.

*   제약 필드에서뿐만 아니라 템플릿에서 짧은 클래스 이름(충분히 자격이 주어지는 대신에) 사용하십시오.

*   템플릿으로서 class $Class$ 사용하면서, 익명의 클래스는 발견될 것입니다.

*   코멘트와 Javadoc 위한 템플릿은 정확한 코멘트와 Javadoc 구문과 함께 변수와 구성소를 포함해야만 합니다.

IDEA  기존 템플릿 다이얼로그에 리스트 세트의 디폴트 템플릿을 가집니다.  사용자는 user defined 아래 거기에서 또한 보여지는 자기 자신의 템플릿을 정의할 있습니다.

그들이 발견했던 템플릿과 패턴은 템플릿 아래에 위치하는 4개의 버튼을 사용하면서 관리될 있습니다.

Save template...  

만일 눌려지면, Save template 다이얼로그를 부르십시오.



Input template name 텍스트 필드에 원하는 템플릿 이름을 다른 사용자 정의의 템플릿을 저장하기 위해 입력하십시오.

Edit variables...  

템플릿 변수를 위해 제약을 설정하는 변수 편집 다이얼로그를 부르십시오.

History...  

Used Templates History 다이얼로그를 부르십시오.



당신은 최고 25개의 최종 호출된 템플릿을 있습니다.  그것을 다시 부르는 Template preview 텍스트 필드에서 당신이 필요한 하나를 선택하십시오.

Copy existing  template...  

사전 정의 또는 사용자 정의 템플릿을 편집하고 또는 적용하도록 Existing Template 부르십시오.



다이얼로그는 상응하는 트리 노드와 함께 마크된 개의 그룹으로 나눠지는 사전 정의의 템플릿을 포함합니다 (expressions, operators, class-based, generics 등과 같은).  또한 사용자 정의의 템플릿을 저장하기 위해 특별한 노드, user defined 있습니다

템플릿을 선택하면서, 당신은 Template preview 필드에서 그것을 것입니다.  Search template 또는 Search/Replacement template 텍스트 필드에서 템플릿을 생성하기 위해, OK 누르십시오.


현재 사용한 템플릿 그룹은 다이얼로그 타이틀 바에 나타납니다.


다이얼로그는 Options 옵션 그룹을 가집니다.

Recursive  matching  

만일 선택되면, 결과에서도 재귀적으로 선택합니다. 구성된 검색에만 이용할 있는.

Case sensitive  

만일 선택되면, 검색을 수행하고 있는 대문자와 소문자는 틀립니다.

Maximum matches  

만일 선택되면, 당신으로 하여금 당신이 얻을 많은 매치를 결정할 있도록 합니다.

디폴트로, 그것은 1000입니다.

Shorten fully  qualified names  

패턴 텍스트가 충분히 자격이 주어지는 클래스 이름을 포함할 경우에 옵션은 뜻이 통합니다.
만일 체크 박스가 선택되면, IDEA 패턴 내에서 이름을 자동적으로 줄일 것입니다.  그렇지 않으면, 충분히 자격이 주어지는 클래스 이름은 사용됩니다.
Structured search and replace에서만 이용할 있는.

Format according  to style  

만일 IDEA 당신의 코드 스타일 설정(상세한 것은, 섹션 코드 스타일 옵션  참조) 따라 확장시키게 되는 코드 프래그먼트를 자동적으로 재포맷하기 바라면 체크 박스를 선택하십시오.

만일 체크 박스가 선택되지 않으면, 포매팅을 그대로 놓고 그것이 확장시키게 되는 코드에서 IDEA 단지 위치에 따라 전체의 템플릿을 들여쓰기 것입니다.
Structured search and replace에서만 이용할 있는.


Scope 드롭-다운 목록은 검색/교체를 실제로 하게 되는 범위의 목록을 포함합니다.  사전 정의의 범위를 선택하거나 또는 ellipsis 버튼을 눌러 불려지는 범위 편집 다이얼로그를 사용하여 당신 자신의 것을 생성하십시오사용자 정의 범위는 또한 목록에 나타날 것입니다.

다이얼로그에서 새로운 검색 결과가 이전의 것을 교체할 것이든지, 또는 새로운 탭이 열릴 것이든 새로운 체크 박스에서 열리는 Open in new tab 체크 박스를 선택하십시오.

Edit 변수 다이얼로그  


다이얼로그는 당신이 템플릿에서 제약과 상태를 모든 변수에 맞추는 것을 가능하게 합니다.  제약은 3개의 옵션 그룹으로 나눠집니다.



Text constraints 규칙적이고 (Perl) 같은 표현식 형태로 또는 클래스 이름으로서 설정된 상태입니다.

Text/regular expression  

펄과 같은 표현식 또는 클래스 이름을 가변 제약으로서 사용되기 위해 타이프하십시오.  클래스 이름을 위해 당신은 기본 코드 완성을 이용할 있습니다.

Invert condition  

만일 선택되면, 텍스트 패턴은 변환시키게 됩니다.

Apply constraint  within type hierarchy  

룩업 패턴이 타입 이름일 그것은 의미를 가집니다.  만일 선택되면, 패턴 매치는 단지 타입 이름에서가  아니라  부모에서(계층 내에서) 검색됩니다.

Whole words  only  

만일 선택되면, 텍스트 내의 전체의 단어가 검색됩니다.  그것은 문자열 리터럴과 코멘트를 위해 의미를 가집니다.



Occurrences count  얼마나 많은 순차적 요소(매개 변수, 선언 또는 스테이트먼트 목록에) 변수가 포함할 있는 지를 설정합니다.

Minimum count  

목록의 최소의 요소 .

Maximum count  

목록의 최대한의 요소 .

 


변수가 있거나 또는 없는 것을 설정하기 위해서 Minimum count 0 그리고 Maximum count 1 설정하십시오.



Expression constraints 변수 표현식을 위한 제약을 설정합니다.

Value is read  

만일 선택되면, 일치하고 있는 변수는 읽힙니다.

Value is written  

만일 선택되면, 일치하고 있는 변수는 써집니다.

Text/regular  expression for java expression type  

만일 입력되면, 표현식 타입은 계층에서 검색됩니다.

Apply constraint  within type hierarchy  

룩업 패턴이 타입 이름일 그것은 의미를 가집니다.  만일 선택되면, 패턴 매치는 단지 타입 이름에서가  아니라  부모에서(계층 내에서) 검색됩니다.

Invert condition  


만일 선택되면, 상응하는 체크 박스 값은 변환시키게 됩니다.


최종 체크(This variable is target of the search) 선택되면, 검색 결과는 전체 표현식이 아니고 선택된 변수만이 보여질 것입니다.

Usecases  

 


대부분의 질의 패턴은 기존 템플릿 다이얼로그에 벌써 존재합니다.


*   Search patterns

1.   Elementary patterns:

$Statement$; pattern matches one statement. Increasing Occurrences count | Maximum count to, for instance, 5, makes it to find sequences having 1 to 5 statements.
$Instance$.$MethodCall$($Arguments$) pattern matches method call expressions. We can specify that method call could be absent by specifying that Occurrences count | Minimal count for the Instance variable is set to zero. Also we could request finding method calls with 3 to 5 parameters by specifying Minimal count = 3, Maximum count = 5 for the Argument variable.

2.   To search for all if statements we could specify the following pattern:

if ($Expr$) {
$ThenStatements$;
}
else {
$ElseStatements$;
}

Occurrences count minimum and maximum values for the ThenStatements and ElseStatements variables are set to 0 and MaxIntValue, respectively.

3.   Search in comments and/or string literals:

Consider one wants to find comments or literal containing '
foo'. Search pattern would be like $SomethingWeWantToFind$ or "$SomethingWeWantToFind$".

Text pattern for
"$SomethingWeWantToFind$" should define comment / literal content of interest (for our example .*foo.*).

In case one wants to find comments/string containing some particular words (say,
foo as word), then Whole words only option for a variable constraint should be set. Text constraint contains word(s) one want to find (foo for our example).

4.   More specific usages of class/interface methods (fields), for instance, equals, etc. which are accessed through descendants (e.g. searching equals called from instances of BaseComponentClass type descendants).

The pattern would be
$Instance$.equals($Parameter$). The Instance variable will have name of the java expression type set to short name of the class (BaseComponentClass), the Apply constraint in type hierarchy option in the Expression constraints group should be set as well.

5.   Let's consider finding all method implementations (say, all methods named show in JComponent descendants):

The search query should be as follows:

class $Class$ extends $JComponent$ {
public void $Show$();
}

Text constraint for the JComponent variable should be JComponent, with type hierarchy in the Text constraint group set to true. Text constraint for the Show variable should be shown with the This variable is target of the search option set to true (since we are looking for methods) as well. Class members will be searched without regard to the order of members in the classes being searched.

*   Replace patterns

oReplacement of empty length array creation with constant static ones.

The search pattern could be following:

new PsiElement[0]

And the replacement pattern:

PsiElement.EMPTY_ARRAY

oAdd try/catch/finally code.

The search pattern is
$Statements$; where the Occurrences count maximum value is Integer.MAX_VALUE.

The replacement pattern is the following:

try {
$Statements$;
}
catch (Exception ex) {
}

To remove such code one needs to revert replace/search patterns.