DoWhatIMeanSupport.st
author Claus Gittinger <cg@exept.de>
Sun, 06 Oct 2019 17:43:47 +0200
changeset 6163 e1e3c7f297ac
parent 6158 0245bdc85be8
child 6217 c5f760048f35
permissions -rw-r--r--
#BUGFIX by exept class: DoWhatIMeanSupport changed: #codeCompletionForLiteralSymbol:element:considerAll:into: #codeCompletionForSmalltalkMethod:orClass:context:codeView:into:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2002 by eXept Software AG
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
     3
	      All Rights Reserved
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libwidg2' }"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
    14
"{ NameSpace: Smalltalk }"
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
    15
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
Object subclass:#DoWhatIMeanSupport
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    17
	instanceVariableNames:'tree tokens languageOrNil classOrNil methodOrNil contextOrNil
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    18
		instanceOrNil codeView rememberedScopeNodes rememberedNodes
5980
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
    19
		codeAspect partialString partialStringInterval classResolverHook'
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    20
	classVariableNames:'LastSource LastParseTree LastScanTokens LastChoices
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    21
		LastCompletedSelectors Verbose'
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    22
	poolDictionaries:''
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    23
	category:'System-Support'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    26
Array variableSubclass:#InputCompletionResult
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    27
	instanceVariableNames:''
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    28
	classVariableNames:''
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    29
	poolDictionaries:''
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    30
	privateIn:DoWhatIMeanSupport
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    31
!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    32
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
!DoWhatIMeanSupport class methodsFor:'documentation'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
copyright
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
 COPYRIGHT (c) 2002 by eXept Software AG
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
    38
	      All Rights Reserved
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
 This software is furnished under a license and may be used
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
 only in accordance with the terms of that license and with the
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
 inclusion of the above copyright notice.   This software may not
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
 be provided or otherwise made available to, or used by, any
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
 other person.  No title to or ownership of the software is
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
 hereby transferred.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
documentation
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    51
    Attention: this is currently being rewritten and refactored.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    52
    Don't get mad at the ugly (and duplicate) code.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    53
    Will cleanup when finished.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    54
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    misc collected UI support (functional)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    56
    These used to be in the Smalltalk and SystemBrowser class;
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    57
    however, they are only needed for programmers, and some of the stuff is useful in multiple
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    58
    places.
3667
acb358ca4b0b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3660
diff changeset
    59
    Therefore it is:
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
    60
	1) not needed for standalone executables
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
    61
	2) published here to avoid multiple implementations
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
    [author:]
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
    64
	Claus Gittinger (cg@exept.de)
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    66
"
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    67
! !
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    68
5869
045fb4db55e3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5804
diff changeset
    69
!DoWhatIMeanSupport class methodsFor:'cleanup'!
045fb4db55e3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5804
diff changeset
    70
045fb4db55e3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5804
diff changeset
    71
lowSpaceCleanup
045fb4db55e3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5804
diff changeset
    72
    LastSource := LastParseTree := LastScanTokens := nil.
045fb4db55e3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5804
diff changeset
    73
045fb4db55e3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5804
diff changeset
    74
    "Created: / 01-08-2018 / 22:31:39 / Claus Gittinger"
045fb4db55e3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5804
diff changeset
    75
! !
045fb4db55e3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5804
diff changeset
    76
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    77
!DoWhatIMeanSupport class methodsFor:'code completion'!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    78
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    79
codeCompletionFor: aspect language: languageOrNil method:methodOrNil orClass:classOrNil context:contextOrNil codeView:codeView into:actionBlock
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    80
    "aspect is so-called code-aspect symbol saying what's edited - #method, #expression, #classDefinition...
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    81
     contextOrNil is the current context, if this is called from the debugger;
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    82
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    83
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    84
     because we actually know what a variable's type is."
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    85
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    86
    ^ self new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    87
        codeCompletionFor: aspect
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    88
        language: languageOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    89
        method:methodOrNil orClass:classOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    90
        context:contextOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    91
        codeView:codeView into:actionBlock
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    92
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    93
    "Created: / 27-09-2013 / 10:19:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    94
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    95
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
    96
codeCompletionForLanguage: languageOrNil class: classOrNil context:contextOrNil codeView:codeView
3900
82fa031be815 comment/format in: #codeCompletionForClass:context:codeView:
Claus Gittinger <cg@exept.de>
parents: 3896
diff changeset
    97
    "contextOrNil is the current context, if this is called from the debugger;
3557
a001bf3df400 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3554
diff changeset
    98
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    99
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
   100
     because we actually know what a variable's type is."
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   101
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   102
    ^ self new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
   103
        codeCompletionForLanguage: languageOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
   104
        class:classOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
   105
        context:contextOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
   106
        codeView:codeView
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   107
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   108
    "Created: / 18-09-2013 / 13:34:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   109
! !
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   110
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   111
!DoWhatIMeanSupport class methodsFor:'code completion - helpers'!
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   112
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   113
findNodeForInterval:interval in:source
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   114
    "utility"
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   115
    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   116
    |tree node remember|
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   117
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   118
    interval isEmpty ifTrue: [^ nil].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   119
    RBParser isNil ifTrue: [^ nil].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   120
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   121
    source = LastSource ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   122
        tree := LastParseTree.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   123
    ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   124
        remember := true.    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   125
        LastSource := LastParseTree := nil.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   126
        tree := RBParser
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   127
                parseMethod:source
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   128
                onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   129
                    [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   130
                        "/ Transcript showCR:'Parse-Error: ',str.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   131
                        nil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   132
                    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   133
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   134
        tree isNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   135
            "/ try to parse as an expression
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   136
            tree := RBParser
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   137
                    parseExpression:source
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   138
                    onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   139
                        [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   140
                            "Transcript showCR:'Parse-Error: ',str."
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   141
                            nil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   142
                        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   143
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   144
            tree isNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   145
                "/ try to parse the selected text alone as expression
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   146
                remember := false.    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   147
                tree := RBParser
5973
0608413dbe36 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5931
diff changeset
   148
                    parseExpression:(source copyFrom:(interval start max:1) to:((interval stop max:1) min:source size))
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   149
                    onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   150
                        [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   151
                            "Transcript showCR:'Parse-Error: ',str."
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   152
                            nil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   153
                        ].         
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   154
                ^ tree
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   155
            ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   156
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   157
        remember ifTrue:[ 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   158
            LastSource := source.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   159
            LastParseTree := tree.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   160
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   161
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   162
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   163
    Error handle:[:ex |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   164
    ] do:[ 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   165
        node := tree whichNodeIsContainedBy:interval.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   166
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   167
    node isNil ifTrue: [
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   168
        node := tree bestNodeFor: interval.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   169
        node isNil ifTrue: [
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   170
            node := self findNodeIn:tree forInterval:interval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   171
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   172
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   173
    ^ node
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   174
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   175
    "Modified: / 06-07-2011 / 12:42:53 / cg"
5973
0608413dbe36 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5931
diff changeset
   176
    "Modified: / 17-12-2018 / 17:32:30 / Claus Gittinger"
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   177
!
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   178
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   179
findNodeForInterval:interval in:source allowErrors:allowErrors
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   180
    ^ self new findNodeForInterval:interval in:source allowErrors:allowErrors
4080
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   181
!
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   182
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   183
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   184
    "if mustBeMethod is true, do not try a regular expression (as in a workspace)."
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   185
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   186
    ^ self new
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   187
	findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
3306
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   188
!
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   189
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   190
findNodeForInterval:interval inParseTree:parseTree
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   191
    ^ self new findNodeForInterval:interval inParseTree:parseTree
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   192
!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   193
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   194
findNodeIn:aTree forInterval:anInterval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   195
    "utility"
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   196
    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   197
    |nodeFound wouldReturn|
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   198
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   199
    anInterval isEmpty ifTrue:[^nil].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   200
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   201
    nodeFound := nil.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   202
    aTree nodesDo:[:eachNode |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   203
        (eachNode intersectsInterval:anInterval) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   204
            (nodeFound isNil or:[nodeFound == eachNode parent]) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   205
                nodeFound := eachNode
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   206
            ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   207
                (nodeFound parent == eachNode parent
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   208
                and:[ eachNode start >= nodeFound start
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   209
                      and:[ eachNode stop <= nodeFound stop ] ]) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   210
                ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   211
                    (nodeFound parent notNil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   212
                    and:[nodeFound parent isCascade and:[eachNode parent isCascade]]) ifFalse:[^ nil]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   213
                ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   214
            ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   215
        ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   216
            nodeFound notNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   217
                "/ already found one - beyond that one; leave
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   218
                wouldReturn notNil ifTrue:[wouldReturn := nodeFound].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   219
            ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   220
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   221
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   222
"/ (wouldReturn notNil and:[wouldReturn ~~ node]) ifTrue:[self halt].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   223
    ^ nodeFound
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   224
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   225
    "Modified: / 20-11-2006 / 12:31:12 / cg"
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   228
!DoWhatIMeanSupport class methodsFor:'code completion - obsolete'!
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   229
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   230
codeCompletionForClass:classOrNil context:contextOrNil codeView:codeView
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   231
    <resource: #obsolete>
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   232
    "contextOrNil is the current context, if this is called from the debugger;
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   233
     nil, if called from the browser.
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   234
     If nonNil, we can make better guesses, because we actually know what a variable's type is.
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   235
     This is not yet done, sigh"
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   236
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   237
    ^ self
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   238
	codeCompletionForLanguage: nil class:classOrNil context:contextOrNil codeView:codeView
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   239
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   240
    "Modified: / 18-09-2013 / 13:34:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   241
!
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   242
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   243
codeCompletionForMethod:methodOrNil orClass:classOrNil context:contextOrNil codeView:codeView into:actionBlock
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   244
    <resource: #obsolete>
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   245
    "contextOrNil is the current context, if this is called from the debugger;
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   246
     nil, if called from the browser.
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   247
     If nonNil, we can make better guesses, because we actually know what a variable's type is.
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   248
     This is not yet done, sigh"
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   249
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   250
    ^ self new
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   251
	codeCompletionForMethod:methodOrNil orClass:classOrNil
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   252
	context:contextOrNil
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   253
	codeView:codeView into:actionBlock
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   254
! !
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
   255
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
   256
!DoWhatIMeanSupport class methodsFor:'input field completion support'!
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   257
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   258
classCategoryCompletion:aPartialCategory inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   259
    "given a partial class category name, return an array consisting of
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   260
     2 entries: 1st: the best (longest) match
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   261
                2nd: collection consisting of matching categories"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   262
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   263
    |matches best lcName|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   264
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   265
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   266
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   267
    "/ search for exact match
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   268
    anEnvironment allClassesDo:[:aClass |
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   269
        |category|
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   270
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   271
        category := aClass category.
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   272
        (category notNil and:[category startsWith:aPartialCategory]) ifTrue:[
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   273
            matches add:category
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   274
        ]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   275
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   276
    matches isEmpty ifTrue:[
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   277
        "/ search for case-ignoring match
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   278
        lcName := aPartialCategory asLowercase.
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   279
        anEnvironment allClassesDo:[:aClass |
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   280
            |category|
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   281
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   282
            category := aClass category.
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   283
            (category notNil and:[category asLowercase startsWith:lcName]) ifTrue:[
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   284
                matches add:category
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   285
            ].
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   286
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   287
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   288
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   289
    matches isEmpty ifTrue:[
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   290
        ^ Array with:aPartialCategory with:(Array with:aPartialCategory)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   291
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   292
    matches size == 1 ifTrue:[
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   293
        ^ Array with:matches first with:(matches asArray)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   294
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   295
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   296
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   297
    ^ Array with:best with:matches asArray
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   298
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   299
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   300
     Smalltalk classCategoryCompletion:'Sys'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   301
     Smalltalk classCategoryCompletion:'System'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   302
     Smalltalk classCategoryCompletion:'System-BinaryStorage'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   303
    "
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   304
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   305
    "Created: / 10-08-2006 / 13:06:45 / cg"
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   306
    "Modified: / 03-03-2019 / 22:42:47 / Claus Gittinger"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   307
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   308
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   309
classNameEntryCompletionBlock
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   310
    "this block can be used in a dialog to perform className completion"
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   311
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   312
    ^ self entryCompletionBlockFor:#'classnameCompletion:inEnvironment:'
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   313
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   314
    "Modified: / 10-08-2006 / 13:22:02 / cg"
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   315
!
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   316
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   317
classnameCompletion:aPartialClassName filter:filterBlock inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   318
    "given a partial classname, return an array consisting of
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   319
     2 entries: 1st: the best (longest) match
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   320
                2nd: collection consisting of matching names"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   321
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   322
    |searchName matches matchedNamesWithoutPrefix ignCaseMatches best isMatchString cls nsPrefix
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   323
     others lcSearchName tryToMatch idx words w1 w2 rslt bestMatch matchesForLongestPrefix|
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   324
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   325
    (words := aPartialClassName asCollectionOfWords) size > 1 ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   326
        w1 := words first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   327
        w2 := words second.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   328
        rslt := self classnameCompletion:w1 filter:filterBlock inEnvironment:anEnvironment.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   329
        bestMatch := rslt first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   330
        matches := rslt second.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   331
        ('class' copyTo:(w2 size min:5)) = w2 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   332
            matches := matches collect:[:m | m , ' class'].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   333
            bestMatch := bestMatch , ' class'.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   334
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   335
        ^ InputCompletionResult bestName:bestMatch matchingNames:matches
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   336
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   337
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   338
    (aPartialClassName startsWith:'Smalltalk::') ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   339
        nsPrefix := 'Smalltalk::'.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   340
        searchName := aPartialClassName withoutPrefix:'Smalltalk::'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   341
    ] ifFalse:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   342
        nsPrefix := ''.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   343
        searchName := aPartialClassName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   344
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   345
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   346
    searchName := searchName asUppercaseFirst.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   347
    lcSearchName := searchName asLowercase.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   348
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   349
    isMatchString := searchName includesMatchCharacters.
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   350
    (searchName size > 2 
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   351
        and:[ searchName first = $* 
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   352
        and:[ searchName last = $* ]]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   353
    ) ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   354
        isMatchString := false.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   355
        searchName := searchName unquote:$*.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   356
    ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   357
    
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   358
    searchName isEmpty ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   359
        matches := Smalltalk allClassesForWhich:filterBlock.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   360
        ^ InputCompletionResult bestName:searchName matchingNames:#()
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   361
    ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   362
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   363
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   364
    matchedNamesWithoutPrefix := Set new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   365
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   366
    others := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   367
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   368
    tryToMatch :=
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   369
        [:className :fullClassName|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   370
            |addIt|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   371
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   372
            isMatchString ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   373
                addIt := searchName match:className
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   374
            ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   375
                addIt := className includesString:searchName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   376
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   377
            addIt ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   378
                matches add:(nsPrefix , fullClassName).
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   379
                matchedNamesWithoutPrefix add:className.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   380
            ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   381
                "/ try ignoring case
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   382
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   383
                isMatchString ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   384
                    addIt := searchName match:className caseSensitive:false
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   385
                ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   386
                    addIt := className includesString:lcSearchName caseSensitive:false.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   387
                    addIt ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   388
                        others add:className
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   389
                    ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   390
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   391
                addIt ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   392
                    ignCaseMatches add:(nsPrefix , fullClassName).
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   393
                    matchedNamesWithoutPrefix add:className.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   394
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   395
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   396
            addIt
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   397
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   398
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   399
    anEnvironment allClassesForWhich:filterBlock do:[:aClass |
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   400
        |addIt fullClassName classNameWithoutPrefix|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   401
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   402
        aClass isMeta ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   403
            fullClassName := aClass name.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   404
            classNameWithoutPrefix := aClass nameWithoutPrefix.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   405
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   406
            addIt := tryToMatch value:fullClassName value:fullClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   407
            addIt ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   408
                classNameWithoutPrefix ~~ fullClassName ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   409
                    tryToMatch value:classNameWithoutPrefix value:fullClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   410
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   411
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   412
        ]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   413
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   414
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   415
"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   416
"/        matches := ignCaseMatches.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   417
"/    ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   418
    matches := matches , ignCaseMatches.
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   419
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   420
"/    matches isEmpty ifTrue:[
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   421
"/        matches := ignCaseMatches.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   422
"/
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   423
"/"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   424
"/"/        | nearBy |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   425
"/"/        nearBy := SortedCollection new sortBlock:[:a :b | a key < b key].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   426
"/"/        others do:[:className |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   427
"/"/            |lcClassName dist cmpName|
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   428
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   429
"/"/            lcClassName := className asLowercase.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   430
"/"/            dist := lcClassName levenshteinTo:lcSearchName s:9 k:1 c:0 i:9 d:2.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   431
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   432
"/"/            cmpName := lcClassName copyTo:(lcSearchName size min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   433
"/"/            dist := dist min:(cmpName levenshteinTo:lcSearchName s:9 k:1 c:0 i:9 d:2).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   434
"/"/            cmpName := lcClassName copyTo:(lcSearchName size + 1 min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   435
"/"/            dist := dist min:(cmpName levenshteinTo:lcSearchName s:9 k:1 c:0 i:9 d:2).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   436
"/"/            dist < 4 ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   437
"/"/                nearBy add:( dist -> (nsPrefix , className) ).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   438
"/"/            ]
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   439
"/"/        ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   440
"/"/        matches := nearBy collect:[:eachPair | eachPair value].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   441
"/"/    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   442
"/    ].
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   443
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   444
    matches isEmpty ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   445
        ^ InputCompletionResult bestName:searchName matchingNames:(Array with:searchName)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   446
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   447
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   448
    matches size == 1 ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   449
        best := matches first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   450
        ^ InputCompletionResult bestName:best matchingNames:(matches asArray)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   451
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   452
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   453
    matches
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   454
        sort:[:name1 :name2 |
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   455
            "name1 comes before:name2 iff"
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   456
            ((name2 includes:$:) and:[(name1 includes:$:) not])
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   457
            or:[ ((name1 includes:$:) == (name2 includes:$:))
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   458
                  and:[ (name1 size < name2 size)
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   459
                        or: [ name1 < name2 ]]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   460
               ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   461
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   462
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   463
    isMatchString ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   464
        best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   465
    ] ifFalse:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   466
        matchesForLongestPrefix := matches select:[:m | m asLowercase startsWith:lcSearchName].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   467
        best := ignCaseMatches isEmpty
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   468
                    ifTrue:[ matchesForLongestPrefix longestCommonPrefix ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   469
                    ifFalse:[ matchesForLongestPrefix longestCommonPrefixCaseSensitive:false ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   470
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   471
        best size < aPartialClassName size "best size == 0" ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   472
            best := matchedNamesWithoutPrefix longestCommonPrefix.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   473
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   474
        best size == 0 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   475
            "if tried again, return next match"
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   476
            idx := ((matches indexOf:aPartialClassName) + 1) \\ matches size.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   477
            idx ~~ 1 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   478
                ^ InputCompletionResult bestName:(matches at:idx) matchingNames:(matches asArray)
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   479
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   480
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   481
        best size < aPartialClassName size ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   482
            best := aPartialClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   483
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   484
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   485
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   486
    cls := anEnvironment classNamed:best.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   487
    (cls isBehavior and:[cls isNameSpace]) ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   488
        (matches conform:[:each | each = best
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   489
                                 or:[each startsWith:(best , '::')]])
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   490
        ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   491
            best := best , '::'
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   492
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   493
    ].
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   494
    ^ InputCompletionResult bestName:best matchingNames:matches asArray
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   495
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   496
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   497
     Smalltalk classnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   498
     Smalltalk classnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   499
     Smalltalk classnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   500
     Smalltalk classnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   501
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   502
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   503
    "Created: / 10-08-2006 / 13:01:08 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   504
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   505
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   506
classnameCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   507
    "given a partial classname, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   508
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   509
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   510
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   511
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   512
	classnameCompletion:aPartialClassName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   513
	filter:[:cls | true]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   514
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   515
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   516
    "
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   517
     self classnameCompletion:'Arr'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   518
     self classnameCompletion:'Arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   519
     self classnameCompletion:'arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   520
     self classnameCompletion:'*rray' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   521
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   522
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   523
    "Created: / 24-11-1995 / 17:24:45 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   524
    "Modified: / 10-08-2006 / 13:01:30 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   525
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   526
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   527
entryCompletionBlockFor:completionSelector
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   528
    "this block can be used in a dialog to perform className completion"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   529
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   530
    ^ [:contents :field  |
5687
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   531
          |s what m|
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   532
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   533
          s := contents withoutSpaces.
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   534
          field topView withCursor:(Cursor questionMark) do:[
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   535
              what := self perform:completionSelector with:s with:Smalltalk.
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   536
          ].
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   537
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   538
          field contents:(what first).
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   539
          (what at:2) size ~~ 1 ifTrue:[
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   540
              field device beepInEditor
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
   541
          ]
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   542
      ].
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   543
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   544
    "Created: / 10-08-2006 / 13:21:37 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   545
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   546
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   547
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   548
    "given a partial globalName, return an array consisting of
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   549
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   550
		2nd: collection consisting of matching names"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   551
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   552
    ^ self globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:true
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   553
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   554
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   555
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   556
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   557
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   558
     Smalltalk globalnameCompletion:'*rray'
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   559
    "
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   560
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   561
    "Created: / 10-08-2006 / 13:06:23 / cg"
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   562
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   563
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   564
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   565
    "given a partial globalName, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   566
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   567
		2nd: collection consisting of matching names"
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   568
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   569
    |searchName matches ignCaseMatches best isMatchString|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   570
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   571
    searchName := aPartialGlobalName.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   572
    searchName isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   573
	^ Array with:searchName with:#()
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   574
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   575
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   576
    (searchName at:1) isLowercase ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   577
	searchName := searchName copy asUppercaseFirst
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   578
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   579
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   580
    isMatchString := doMatch and:[ searchName includesMatchCharacters ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   581
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   582
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   583
    anEnvironment keysDo:[:aGlobalName |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   584
	| addIt|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   585
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   586
	isMatchString ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   587
	    addIt := searchName match:aGlobalName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   588
	] ifFalse:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   589
	    addIt := aGlobalName startsWith:searchName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   590
	].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   591
	addIt ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   592
	    matches add:aGlobalName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   593
	] ifFalse:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   594
	    "/ try ignoring case
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   595
	    isMatchString ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   596
		addIt := searchName match:aGlobalName caseSensitive:false
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   597
	    ] ifFalse:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   598
		addIt := aGlobalName asLowercase startsWith:searchName asLowercase
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   599
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   600
	    addIt ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   601
		ignCaseMatches add:aGlobalName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   602
	    ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   603
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   604
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   605
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   606
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   607
	matches := ignCaseMatches
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   608
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   609
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   610
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   611
	^ Array with:searchName with:(Array with:searchName)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   612
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   613
    matches size == 1 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   614
	^ Array with:matches first with:(matches asArray)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   615
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   616
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   617
    isMatchString ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   618
	best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   619
    ] ifFalse:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   620
	best := matches longestCommonPrefix.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   621
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   622
    ^ Array with:best with:matches asArray
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   623
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   624
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   625
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   626
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   627
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   628
     Smalltalk globalnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   629
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   630
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   631
    "Created: / 10-08-2006 / 13:06:23 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   632
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   633
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   634
methodProtocolCompletion:aPartialProtocolName inEnvironment:anEnvironment
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   635
    "given a partial method protocol name, return an array consisting of
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   636
     2 entries: 1st: the best (longest) match
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   637
                2nd: collection consisting of matching protocols"
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   638
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   639
    |matches best lcName|
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   640
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   641
    matches := IdentitySet new.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   642
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   643
    "/ search for exact match
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   644
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   645
        |protocol|
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   646
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   647
        protocol := eachMethod category.
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   648
        (protocol notNil and:[protocol startsWith:aPartialProtocolName]) ifTrue:[
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   649
            matches add:protocol
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   650
        ].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   651
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   652
    matches isEmpty ifTrue:[
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   653
        "/ search for case-ignoring match
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   654
        lcName := aPartialProtocolName asLowercase.
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   655
        anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   656
            |protocol|
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   657
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   658
            protocol := eachMethod category.
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   659
            (protocol notNil and:[protocol asLowercase startsWith:lcName]) ifTrue:[
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   660
                matches add:protocol
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   661
            ].
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   662
        ].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   663
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   664
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   665
    matches isEmpty ifTrue:[
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   666
        ^ Array with:aPartialProtocolName with:(Array with:aPartialProtocolName)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   667
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   668
    matches size == 1 ifTrue:[
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   669
        ^ Array with:matches first with:(matches asArray)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   670
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   671
    matches := matches asSortedCollection.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   672
    best := matches longestCommonPrefix.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   673
    ^ Array with:best with:matches asArray
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   674
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   675
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   676
     Smalltalk methodProtocolCompletion:'doc'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   677
     Smalltalk methodProtocolCompletion:'docu'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   678
     Smalltalk methodProtocolCompletion:'documenta'
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   679
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   680
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   681
    "Created: / 10-08-2006 / 13:05:27 / cg"
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   682
    "Modified: / 16-03-2011 / 12:30:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
   683
    "Modified: / 03-03-2019 / 22:43:07 / Claus Gittinger"
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   684
!
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   685
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   686
nameSpaceCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   687
    "given a partial name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   688
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   689
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   690
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   691
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   692
	classnameCompletion:aPartialClassName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   693
	filter:[:cls | cls isNameSpace]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   694
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   695
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   696
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   697
     DoWhatIMeanSupport nameSpaceCompletion:'To'  inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   698
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   699
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   700
    "Created: / 10-08-2006 / 13:02:16 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   701
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   702
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   703
packageCompletion:aPartialPackage inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   704
    "given a partial package name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   705
     2 entries: 1st: the best (longest) match
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   706
                2nd: collection consisting of matching packages"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   707
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   708
    |matches best lcName|
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   709
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   710
    matches := Smalltalk allPackageIDs
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   711
        select:[:package | package startsWith:aPartialPackage].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   712
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   713
    matches isEmpty ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   714
        "/ search for case-ignoring match
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   715
        lcName := aPartialPackage asLowercase.
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   716
        anEnvironment allClassesDo:[:aClass |
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   717
            |package|
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   718
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   719
            package := aClass package.
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   720
            (package notNil and:[package asLowercase startsWith:lcName]) ifTrue:[
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   721
                matches add:package
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   722
            ].
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   723
        ].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   724
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   725
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   726
    matches isEmpty ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   727
        ^ Array with:aPartialPackage with:(Array with:aPartialPackage)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   728
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   729
    matches size == 1 ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   730
        ^ Array with:matches first with:(matches asArray)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   731
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   732
    matches := matches asSortedCollection.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   733
    best := matches longestCommonPrefix.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   734
    ^ Array with:best with:matches asArray
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   735
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   736
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   737
     DoWhatIMeanSupport packageCompletion:'stx:' inEnvironment:Smalltalk
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   738
     DoWhatIMeanSupport packageCompletion:'stx:libw' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   739
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   740
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   741
    "Created: / 10-08-2006 / 13:05:07 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   742
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   743
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   744
packageNameEntryCompletionBlock
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   745
    "this block can be used in a dialog to perform className completion"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   746
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   747
    ^ self entryCompletionBlockFor:#'packageCompletion:inEnvironment:'
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   748
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   749
    "Created: / 10-08-2006 / 13:22:31 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   750
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   751
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   752
poolnameCompletion:aPartialClassName inEnvironment:anEnvironment
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   753
    "given a partial poolname, return an array consisting of
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   754
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   755
		2nd: collection consisting of matching names"
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   756
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   757
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   758
	classnameCompletion:aPartialClassName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   759
	filter:[:cls | cls isSharedPool]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   760
	inEnvironment:anEnvironment
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   761
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   762
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   763
     self poolnameCompletion:'Win' inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   764
     self poolnameCompletion:'Z'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   765
     self poolnameCompletion:'a'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   766
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   767
!
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   768
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   769
resourceCompletion:aPartialResourceName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   770
    "given a partial resource name, return an array consisting of
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   771
     2 entries: 1st: the longest match
5713
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   772
                2nd: collection consisting of matching defined resources"
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   773
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   774
    |matches best lcSym isMatch|
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   775
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   776
    matches := IdentitySet new.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   777
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   778
    isMatch := doMatch and:[aPartialResourceName includesMatchCharacters].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   779
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   780
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
5713
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   781
        eachMethod hasResource ifTrue:[
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   782
            eachMethod resources keysDo:[:eachResourceName |
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   783
                |addToMatches|
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   784
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   785
                isMatch ifTrue:[ 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   786
                    addToMatches := aPartialResourceName match:eachResourceName caseSensitive:ignoreCase not 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   787
                ] ifFalse:[ 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   788
                    ignoreCase ifTrue:[ 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   789
                        addToMatches := eachResourceName asLowercase startsWith:aPartialResourceName asLowercase 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   790
                    ] ifFalse:[ 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   791
                        addToMatches := eachResourceName startsWith:aPartialResourceName 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   792
                    ] 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   793
                ].
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   794
                addToMatches ifTrue:[
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   795
                    matches add:eachResourceName
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   796
                ].
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   797
            ].
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   798
        ].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   799
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   800
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
5713
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   801
        "/ search for case-ignoring match
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   802
        lcSym := aPartialResourceName asLowercase.
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   803
        anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   804
            eachMethod hasResource ifTrue:[
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   805
                eachMethod resources keysDo:[:eachResourceName |
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   806
                    |addToMatches|
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   807
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   808
                    isMatch ifTrue:[ 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   809
                        addToMatches := aPartialResourceName match:eachResourceName caseSensitive:false 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   810
                    ] ifFalse:[ 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   811
                        addToMatches := eachResourceName asLowercase startsWith:lcSym 
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   812
                    ].
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   813
                    addToMatches ifTrue:[
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   814
                        matches add:eachResourceName
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   815
                    ].
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   816
                ].
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   817
            ].
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   818
        ].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   819
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   820
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   821
    matches isEmpty ifTrue:[
5713
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   822
        ^ Array with:aPartialResourceName with:#()
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   823
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   824
    matches size == 1 ifTrue:[
5713
c07c5d59bbff #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5706
diff changeset
   825
        ^ Array with:matches first with:(matches asArray)
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   826
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   827
    matches := matches asSortedCollection.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   828
    best := matches longestCommonPrefix.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   829
    ^ Array with:best with:matches asArray
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   830
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   831
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   832
     DoWhatIMeanSupport resourceCompletion:'*debug*' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   833
     DoWhatIMeanSupport resourceCompletion:'context' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   834
     DoWhatIMeanSupport resourceCompletion:'key' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   835
     DoWhatIMeanSupport resourceCompletion:'cont' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   836
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   837
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   838
    "Created: / 06-07-2011 / 12:04:41 / cg"
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   839
!
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   840
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   841
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   842
    "given a partial selector, return an array consisting of
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   843
     2 entries: 1st: the longest match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   844
		2nd: collection consisting of matching implemented selectors"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   845
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   846
    ^ self selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:false
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   847
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   848
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   849
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   850
    "given a partial selector, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   851
     2 entries: 1st: the longest match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   852
		2nd: collection consisting of matching implemented selectors"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   853
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   854
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   855
	selectorCompletion:aPartialSymbolName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   856
	inEnvironment:anEnvironment
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   857
	match:doMatch
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   858
	ignoreCase:false
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   859
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   860
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   861
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   862
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   863
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   864
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   865
     DoWhatIMeanSupport selectorCompletion:'nextp' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   866
    "
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   867
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   868
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   869
    "Modified: / 26-10-2010 / 20:30:27 / cg"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   870
!
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   871
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   872
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   873
    "given a partial selector, return an array consisting of
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   874
     2 entries: 1st: the longest match
5714
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   875
                2nd: collection consisting of matching implemented selectors"
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   876
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   877
    |matches best lcSym isMatch|
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   878
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   879
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   880
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   881
    isMatch := doMatch and:[aPartialSymbolName includesMatchCharacters].
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   882
3751
eafbe64ab0fc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3734
diff changeset
   883
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
5714
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   884
        |addToMatches|
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   885
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   886
        isMatch ifTrue:[ 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   887
            addToMatches := (aPartialSymbolName match:eachSelector caseSensitive:ignoreCase not) 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   888
        ] ifFalse:[ 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   889
            ignoreCase ifTrue:[ 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   890
                addToMatches := (eachSelector asLowercase startsWith:aPartialSymbolName asLowercase) 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   891
            ] ifFalse:[ 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   892
                addToMatches := (eachSelector startsWith:aPartialSymbolName) 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   893
            ] 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   894
        ].
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   895
        addToMatches ifTrue:[
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   896
            matches add:eachSelector
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   897
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   898
    ].
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   899
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
5714
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   900
        "/ search for case-ignoring match
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   901
        lcSym := aPartialSymbolName asLowercase.
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   902
        anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   903
            |addToMatches|
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   904
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   905
            isMatch ifTrue:[ 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   906
                addToMatches := (aPartialSymbolName match:eachSelector caseSensitive:false) 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   907
            ] ifFalse:[ 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   908
                addToMatches := (eachSelector asLowercase startsWith:lcSym) 
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   909
            ].
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   910
            addToMatches ifTrue:[
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   911
                matches add:eachSelector
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   912
            ].
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   913
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   914
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   915
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   916
    matches isEmpty ifTrue:[
5714
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   917
        ^ Array with:aPartialSymbolName with:#() "/ (Array with:aPartialSymbolName)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   918
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   919
    matches size == 1 ifTrue:[
5714
043564e0ae20 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5713
diff changeset
   920
        ^ Array with:matches first with:(matches asArray)
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   921
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   922
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   923
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   924
    ^ Array with:best with:matches asArray
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   925
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   926
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   927
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   928
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   929
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3867
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   930
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   931
     DoWhatIMeanSupport selectorCompletion:'nextp' inEnvironment:Smalltalk match:true
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   932
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   933
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   934
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   935
    "Created: / 26-10-2010 / 20:30:06 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   936
! !
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   937
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   938
!DoWhatIMeanSupport class methodsFor:'rename support'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   939
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   940
goodRenameDefaultFor:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   941
    "generate a reasonable default for a rename operation.
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   942
     (used for rename category etc.)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
   943
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   944
    |prefix suffix lastNewSize lastOldSize left right inserted deleted tryAgain|
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   945
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   946
    lastNewName isNil ifTrue:[ ^ nil].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   947
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   948
    lastNewSize := lastNewName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   949
    lastOldSize := lastOldName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   950
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   951
    (lastNewName endsWith:lastOldName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   952
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   953
            'foo' -> 'Xfoo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   954
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   955
            'bar' would be 'Xbar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   956
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   957
        prefix := lastNewName copyTo:(lastNewSize - lastOldSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   958
        ^ (prefix , oldName).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   959
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   960
    (lastOldName endsWith:lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   961
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   962
            'Xfoo' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   963
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   964
            'Xbar' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   965
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   966
        prefix := lastOldName copyTo:(lastOldSize - lastNewSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   967
        (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   968
            ^ (oldName copyFrom:prefix size+1).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   969
        ]
2514
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   970
    ].
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   971
    (lastOldName asLowercase = lastNewName asLowercase) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   972
        (lastOldName first ~= lastNewName first) ifTrue:[
5552
2fe0fa28ecf5 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5551
diff changeset
   973
            (lastOldName isLowercaseFirst = oldName isLowercaseFirst) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   974
                "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   975
                    'xfoo' -> 'Xfoo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   976
                 then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   977
                    'xbar' would be 'Xbar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   978
                "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   979
                lastOldName first isLowercase ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   980
                    ^ oldName asUppercaseFirst "oldName first asUppercase asString , (oldName copyFrom:2)".
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   981
                ] ifFalse:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   982
                    ^ oldName asLowercaseFirst "oldName first asLowercase asString , (oldName copyFrom:2)".
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   983
                ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   984
            ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   985
        ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   986
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   987
    (lastOldName withoutSeparators = lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   988
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   989
            '  foo   ' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   990
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   991
            '  bar   ' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   992
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   993
        ^ oldName withoutSeparators.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   994
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   995
    (lastNewName startsWith:lastOldName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   996
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   997
            'foo' -> 'fooX'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   998
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   999
            'bar' would be 'barX'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1000
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1001
        suffix := lastNewName copyLast:(lastNewSize - lastOldSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1002
        ^ (oldName , suffix).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1003
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1004
    (lastOldName startsWith:lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1005
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1006
            'fooX' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1007
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1008
            'barX' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1009
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1010
        suffix := lastOldName copyLast:(lastOldSize - lastNewSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1011
        (oldName endsWith:suffix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1012
            ^ (oldName copyButLast:suffix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1013
        ]
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1014
    ].
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1015
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1016
    prefix := lastOldName commonPrefixWith:lastNewName.
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1017
    suffix := lastOldName commonSuffixWith:lastNewName.
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
  1018
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1019
    (prefix size ~~ 0) ifTrue:[
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1020
        (suffix size ~~ 0) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1021
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1022
            prefix := prefix copyTo:(((lastNewName size - suffix size) min:(lastOldName size - suffix size)) min:prefix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1023
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1024
            "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1025
                'fooR' -> 'fooXR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1026
             then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1027
                'barR' would be 'barXR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1028
            "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1029
            left := lastOldName copyTo:prefix size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1030
            right := lastOldName copyLast:suffix size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1031
            lastNewSize > lastOldSize ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1032
                inserted := (lastNewName copyFrom:(left size + 1)) copyButLast:(right size).
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1033
                inserted size ~~ 0 ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1034
                    (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1035
                        ^ oldName copyWithAll:inserted insertedAfterIndex:prefix size
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1036
                    ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1037
                ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1038
            ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1039
            (oldName string endsWith:suffix string) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1040
                deleted := (lastOldName string copyFrom:(prefix size + 1)) copyButLast:(suffix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1041
                (oldName size-suffix size-deleted size + 1) >= 1 ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1042
                    ((oldName copyFrom:oldName size-suffix size-deleted size + 1) copyTo:deleted size) = deleted ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1043
                        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1044
                            'fooXR' -> 'fooR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1045
                         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1046
                            'barXS' would be 'barS'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1047
                        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1048
                        ^ (oldName copyTo:oldName size-suffix size-deleted size) , suffix
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1049
                    ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1050
                ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1051
            ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1052
        ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1053
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1054
        (oldName endsWith:(lastOldName copyFrom:prefix size+1)) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1055
            "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1056
                'fooX' -> 'fooY'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1057
             then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1058
                'barX' would be 'barY'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1059
            "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1060
            left := oldName copyButLast:(lastOldName copyFrom:prefix size+1) size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1061
            right := lastNewName copyFrom:prefix size+1.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1062
            ^ left , right
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1063
        ]
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1064
    ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1065
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1066
    suffix size ~~ 0 ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1067
        |prefix2|
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1068
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1069
        "last rename was:
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1070
            'fooSUFF1' -> 'barSUFF1'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1071
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1072
            'fooSUFF2' -> 'barSUFF2'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1073
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1074
        prefix := lastOldName copyTo:(lastOldName size - suffix size).  "/ the foo
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1075
        (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1076
            prefix2 := lastNewName copyTo:(lastNewName size - suffix size). "/ the bar
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1077
            ^ prefix2,(oldName copyFrom:(prefix size+1)).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1078
        ].
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1079
    ].
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1080
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1081
    "/ was there something stripped at the end?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1082
    suffix := oldName commonSuffixWith:lastOldName.
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1083
    (suffix size ~~ 0) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1084
        ^ self
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1085
            goodRenameDefaultFor:(oldName copyButLast:suffix size)
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1086
            lastOld:(lastOldName copyButLast:suffix size)
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1087
            lastNew:lastNewName.
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1088
    ].
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1089
    ^ nil
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1090
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1091
    "
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1092
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fooXX'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1093
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'XXfoo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1094
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1095
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'foo'
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1096
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1097
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1098
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'fooYY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1099
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1100
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1101
     self goodRenameDefaultFor:'bar2' lastOld:'foo1' lastNew:'foo01'
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
  1102
     self goodRenameDefaultFor:'barXY' lastOld:'fooXY' lastNew:'fooY'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1103
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1104
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXXXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1105
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'foXXXo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1106
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1107
     self goodRenameDefaultFor:'bar001' lastOld:'foo001' lastNew:'foo002_001'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1108
     self goodRenameDefaultFor:'CoastCore-CSFoo' lastOld:'CoastCore-CSBar' lastNew:'Coast-Core-CSBar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1109
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1110
     self goodRenameDefaultFor:'mti.odt2.level1HeadlineStyle'
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1111
                       lastOld:'mti.odt2.level1HeadlineMatchPattern'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1112
                       lastNew:'Key_odt2_level1HeadlineMatchPattern'
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1113
    "
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1114
5552
2fe0fa28ecf5 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5551
diff changeset
  1115
    "Modified: / 22-06-2017 / 06:56:55 / cg"
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1116
    "Modified: / 01-03-2019 / 14:53:49 / Claus Gittinger"
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1117
!
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1118
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1119
goodRenameDefaultForFile:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
  1120
    "generate a reasonable default for a file rename operation.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1121
     (Try to rename multiple files in the new fileBrowser,
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
  1122
     to see what this is doing)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
  1123
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1124
    |prefix suffix t
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1125
     lastOldWOSuffix lastNewWOSuffix oldWOSuffix lastOldRest oldRest lastNewRest
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1126
     lastRemoved lastInserted default|
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1127
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1128
    default := self goodRenameDefaultFor:oldName lastOld:lastOldName lastNew:lastNewName.
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1129
    default notNil ifTrue:[ ^ default].
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1130
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1131
    lastOldWOSuffix := lastOldName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1132
    lastNewWOSuffix := lastNewName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1133
    oldWOSuffix := oldName asFilename nameWithoutSuffix.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1134
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1135
    "/ suffix change ?
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1136
    lastOldWOSuffix = lastNewWOSuffix ifTrue:[
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1137
        lastOldName asFilename suffix ~= lastNewName asFilename suffix ifTrue:[
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1138
            ^ (oldName asFilename withSuffix:(lastNewName asFilename suffix)) pathName
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1139
        ].
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1140
    ].
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1141
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1142
    default := self goodRenameDefaultFor:oldWOSuffix lastOld:lastOldWOSuffix lastNew:lastNewWOSuffix.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1143
    default notNil ifTrue:[
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1144
        lastOldRest := lastOldName copyFrom:lastOldWOSuffix size + 1.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1145
        lastNewRest := lastNewName copyFrom:lastNewWOSuffix size + 1.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1146
        oldRest := oldName copyFrom:oldWOSuffix size + 1.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1147
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1148
        ^ default , lastNewRest
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1149
    ].
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1150
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1151
    prefix := lastOldWOSuffix commonPrefixWith:oldWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1152
    (lastNewWOSuffix startsWith:prefix) ifTrue:[
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1153
        lastOldRest := lastOldWOSuffix copyFrom:prefix size + 1.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1154
        lastNewRest := lastNewWOSuffix copyFrom:prefix size + 1.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1155
        oldRest := oldWOSuffix copyFrom:prefix size + 1.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1156
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1157
        (lastNewRest endsWith:lastOldRest) ifTrue:[
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1158
            t := lastNewRest copyButLast:lastOldRest size.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1159
            ^ ((prefix , t , oldRest) asFilename withSuffix:oldName asFilename suffix) name
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1160
        ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1161
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1162
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1163
    suffix := lastOldWOSuffix commonSuffixWith:lastNewWOSuffix.
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1164
    suffix size ~~ 0 ifTrue:[
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1165
        "/ last change changed something at the beginning
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1166
        prefix := oldWOSuffix commonPrefixWith:lastOldWOSuffix.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1167
        prefix size ~~ 0 ifTrue:[
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1168
            "/ this name starts with the same characters
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1169
            lastRemoved := lastOldWOSuffix copyButLast:suffix size.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1170
            lastInserted := lastNewWOSuffix copyButLast:suffix size.
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1171
            (lastRemoved startsWith:lastInserted) ifTrue:[
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1172
                oldWOSuffix size >= lastInserted size ifTrue:[
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1173
                    ^ (oldWOSuffix copyTo:lastInserted size) , (oldName copyFrom:lastRemoved size + 1)
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1174
                ]
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1175
            ].
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1176
            ^ lastInserted , (oldName copyFrom:lastRemoved size + 1)
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1177
        ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1178
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1179
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1180
    ^ nil
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1181
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1182
    "Modified: / 07-11-2006 / 13:58:39 / cg"
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  1183
    "Modified: / 01-03-2019 / 14:53:36 / Claus Gittinger"
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1184
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1185
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1186
!DoWhatIMeanSupport class methodsFor:'typing distance'!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1187
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1188
isKey:k1 nextTo:k2
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1189
    "return true, if k1 and k2 are adjacent keys on the keyboard.
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
  1190
     This is used to specially priorize plausible typing errors of adjacent keys.
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1191
     CAVEAT: hard coded us-, german and french keyboards here; data should come from somewhere else."
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1192
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1193
    ^ self isKey:k1 nextTo:k2 onKeyboard:(self keyboard)
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1194
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1195
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1196
     self isKey:$a nextTo:$a
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1197
     self isKey:$a nextTo:$s
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1198
     self isKey:$a nextTo:$q
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1199
     self isKey:$a nextTo:$w
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1200
     self isKey:$a nextTo:$z
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1201
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1202
    "
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1203
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1204
    "Modified: / 16-01-2008 / 17:17:31 / cg"
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1205
!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1206
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1207
isKey:k1 nextTo:k2 onKeyboard:keys
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1208
    "return true, if k1 and k2 are adjacent keys on the keyboard defined by keys.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1209
     This is used to specially priorize plausible typing errors of adjacent keys.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1210
     (typo checker uses a modified levenshtein, 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1211
      in which keys next to each other are valued differently)"
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1212
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1213
    |row1 row2 col1 col2|
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1214
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1215
    row1 := keys findFirst:[:eachRow | col1 := eachRow indexOf:k1. col1 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1216
    row1 == 0 ifTrue:[^ false].
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1217
    row2 := keys findFirst:[:eachRow | col2 := eachRow indexOf:k2. col2 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1218
    row2 == 0 ifTrue:[^ false].
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1219
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1220
    ^ (row1-row2) abs <= 1 and:[(col1-col2) abs <= 1]
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1221
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1222
    "
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1223
     self isKey:$a nextTo:$q
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1224
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1225
    "
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1226
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1227
    "Modified (comment): / 01-05-2016 / 12:19:24 / cg"
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1228
!
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1229
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1230
keyboard
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1231
    "the keyboard layout
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1232
     (useful to figure out which keys are nearby a key, to find possible typing errors)
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1233
     CAVEAT: hard coded us-, german and french keyboards here; data should come from somewhere else."
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1234
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1235
    |lang|
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1236
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1237
    lang := UserPreferences current language.
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1238
    lang == #de ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1239
	^ #(
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1240
	       '1234567890-'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1241
	       '*qwertzuiop'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1242
	       '**asdfghjkl:'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1243
	       '***yxcvbnm'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1244
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1245
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1246
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1247
    lang == #fr ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1248
	^ #(
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1249
	       '1234567890'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1250
	       '*azertyuiop'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1251
	       '**qsdfghjklm'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1252
	       '***wxcvbn,'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1253
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1254
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1255
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1256
    ^ #(
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1257
	   '1234567890-'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1258
	   '*qwertyuiop'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1259
	   '**asdfghjkl:'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1260
	   '***zxcvbnm'
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1261
    ).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1262
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1263
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1264
     self keyboard
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1265
    "
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1266
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1267
    "Created: / 16-01-2008 / 17:17:13 / cg"
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1268
! !
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1269
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1270
!DoWhatIMeanSupport methodsFor:'code completion'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1271
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1272
codeCompletionFor: codeAspectArg language: languageOrNilArg method:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1273
    "provide code completion information by analyzing what the editing state is in codeViewArg
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1274
     (cursor position, characters around cursor etc.) and calling back into actionBlock, passing
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1275
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1276
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1277
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1278
        1) the completer needs to know about the text around the cursor position
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1279
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1280
           (although not yet fully implemented, non-local rewrite procedures may and will be added in the future
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1281
     For example, in many situations, both a completion of a unary selector before the cursor,
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1282
     or adding another keyword part after the cursor is possible.
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1283
     Thus, this provides a list of completions PLUS a list of edit operations (as per completion), to
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1284
     perform the completion.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1285
     The caller has to open a dialog, providing the suggestions, and perform the corresponding edit operation.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1286
     An additional array containing a textual description for each suggestion is also provided, which could
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1287
     be shown as info or appended to the suggestions (such as 'complete variable', 'complete keyword', etc.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1288
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1289
     ContextOrNil is the current context, if this is called from the debugger;
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1290
     or nil, if called from the browser.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1291
     If nonNil, we can make better guesses, because we actually know what a variable's type is"
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1292
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1293
    | language |
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1294
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1295
    codeAspect := codeAspectArg.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1296
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1297
    languageOrNilArg notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1298
        language := languageOrNilArg
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1299
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1300
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1301
            | method |
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1302
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1303
            method := contextOrNilArg method.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1304
            method notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1305
                language := method programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1306
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1307
                contextOrNilArg isJavaContext ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1308
                    language := JavaLanguage instance
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1309
                ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1310
                    language := SmalltalkLanguage instance.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1311
                ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1312
            ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1313
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1314
            methodOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1315
                language := methodOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1316
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1317
                classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1318
                    language := classOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1319
                ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1320
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1321
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1322
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1323
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1324
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1325
        language isSmalltalk ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1326
            ^self codeCompletionForSmalltalkMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1327
        ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1328
        language isSTXJavaScript ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1329
            ^self codeCompletionForJavascriptMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1330
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1331
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1332
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1333
    "/ No completion support for given language
5051
6e150dbaf9bc #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 5050
diff changeset
  1334
    "/ self breakPoint: #cg.
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1335
    self breakPoint: #jv.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1336
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1337
    "Created: / 27-09-2013 / 10:21:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4451
8db9cfa578c0 class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4444
diff changeset
  1338
    "Modified: / 26-11-2013 / 23:43:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1339
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1340
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1341
codeCompletionForLanguage: languageOrNil class: classOrNilArg context:contextOrNilArg codeView:codeViewArg
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1342
    "going to become OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1343
     contextOrNil is the current context, if this is called from the debugger;
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1344
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1345
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1346
     because we actually know what a variable's type is."
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1347
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1348
    | language |
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1349
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1350
    languageOrNil notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1351
        language := languageOrNil
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1352
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1353
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1354
            language := contextOrNilArg method programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1355
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1356
            classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1357
                language := classOrNilArg programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1358
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1359
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1360
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1361
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1362
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1363
        language isSmalltalk ifTrue:[
4731
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1364
            classOrNil := classOrNilArg.
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1365
            contextOrNil := contextOrNilArg.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1366
            ^self codeCompletionForSmalltalkClass: classOrNil context: contextOrNil codeView: codeViewArg
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1367
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1368
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1369
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1370
    "/ No completion support for given language
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1371
    self breakPoint: #cg.
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1372
    self breakPoint: #jv.
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1373
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1374
    "Created: / 18-09-2013 / 13:49:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5007
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1375
!
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1376
6126
d57220547995 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 6105
diff changeset
  1377
setClass:classOrNilArg
d57220547995 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 6105
diff changeset
  1378
    classOrNil := classOrNilArg.
d57220547995 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 6105
diff changeset
  1379
!
d57220547995 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 6105
diff changeset
  1380
d57220547995 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 6105
diff changeset
  1381
setClass:classOrNilArg andContext:contextOrNilArg
5007
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1382
    classOrNil := classOrNilArg.
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1383
    contextOrNil := contextOrNilArg.
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1384
!
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1385
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1386
setSelf: instanceOrNilArg 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1387
    instanceOrNil := instanceOrNilArg.
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1388
! !
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1389
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1390
!DoWhatIMeanSupport methodsFor:'code completion - JavaScript'!
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1391
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1392
codeCompletionForJavascriptMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1393
    "provide code completion information by analyzing what the editing state is in codeViewArg
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1394
     (cursor position, characters around cursor etc.) and calling back into actionBlock, passing
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1395
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1396
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1397
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1398
        1) the completer needs to know about the text around the cursor position
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1399
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1400
           (although not yet fully implemented, non-local rewrite procedures may and will be added in the future
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1401
     For example, in many situations, both a completion of a unary selector before the cursor,
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1402
     or adding another keyword part after the cursor is possible.
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1403
     Thus, this provides a list of completions PLUS a list of edit operations (as per completion), to
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1404
     perform the completion.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1405
     The caller has to open a dialog, providing the suggestions, and perform the corresponding edit operation.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1406
     An additional array containing a textual description for each suggestion is also provided, which could
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1407
     be shown as info or appended to the suggestions (such as 'complete variable', 'complete keyword', etc.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1408
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1409
     ContextOrNil is the current context, if this is called from the debugger;
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1410
     or nil, if called from the browser.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1411
     If nonNil, we can make better guesses, because we actually know what a variable's type is"
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1412
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1413
    languageOrNil := STXJavaScriptLanguage instance.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1414
    methodOrNil := methodOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1415
    classOrNil := classOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1416
    codeView := codeViewArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1417
    contextOrNil := contextOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1418
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1419
    JavaScriptCompletionEngine notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1420
        JavaScriptCompletionEngine new
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1421
           completeForMethod: methodOrNil class: classOrNil context: contextOrNil codeView: codeView into: actionBlock.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1422
    ].
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1423
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1424
    self information:'Not yet supported'.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1425
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1426
    "Created: / 18-09-2013 / 16:24:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1427
    "Modified: / 25-09-2013 / 15:13:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1428
! !
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1429
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1430
!DoWhatIMeanSupport methodsFor:'code completion - Smalltalk'!
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1431
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1432
codeCompletionForSmalltalkClass: classOrNilArg context:contextOrNilArg codeView:codeViewArg
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1433
4379
f79671ee6211 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4378
diff changeset
  1434
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1435
     contextOrNil is the current context, if this is called from the debugger;
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1436
     nil, if called from the browser.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1437
     If nonNil, we can make better guesses, because we actually know what a variable's type is.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1438
     This is not yet done, sigh"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1439
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1440
    |crsrPos char interval source node parent checkedNode instanceOrNilArg
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1441
     forceNewMessageSend classOfReceiver prevChar|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1442
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1443
    languageOrNil := SmalltalkLanguage instance.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1444
    classOrNil := classOrNilArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1445
    codeView := codeViewArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1446
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1447
    crsrPos := codeView characterPositionOfCursor"-1".
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1448
    char := codeView characterAtCharacterPosition:crsrPos.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1449
    "/ Transcript show:crsrPos; show:' '; showCR:char.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1450
    [crsrPos > 1 and:[char isSeparator or:['.' includes:char]]] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1451
        crsrPos := crsrPos - 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1452
        char := codeView characterAtCharacterPosition:crsrPos.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1453
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1454
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1455
    interval := codeView selectedInterval.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1456
    "/ Transcript show:'iv: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1457
    interval isEmpty ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1458
        interval := crsrPos"-1" to:crsrPos.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1459
        "/ Transcript show:'iv2: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1460
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1461
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1462
    source := codeView contentsAsString string.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1463
    source := source copyTo:crsrPos.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1464
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1465
    "/ this is too naive and stupid; if there is a syntactic error,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1466
    "/ we will not find a node for a long time (stepping back more and more,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1467
    "/ until reaching the beginning). This leads to a thousand and more times reparsing
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1468
    "/ without any progress.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1469
    "/ TODO: do it vice-versa, in that the parser does a callOut for every node generated
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1470
    "/ as it parses the code. Stop, when the interval is hit.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1471
    "/ that will also work for syntactic incorrect source code.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1472
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1473
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1474
        "/ Transcript show:'nd1: '; showCR:node.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1475
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1476
    node isNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1477
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1478
        "/ Transcript show:'nd2 try: '; showCR:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1479
        node isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1480
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1481
            self breakPoint:#cg.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1482
            "/ self information:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1483
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1484
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1485
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1486
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1487
    forceNewMessageSend := false.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1488
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1489
    "/ if there a separator between the variable's name and the cursor position...
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1490
    prevChar := codeView characterBeforeCursor.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1491
    (prevChar isSeparator or:[ ')}]''' includes:prevChar ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1492
        (node isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1493
            and:[ (parent := node parent) notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1494
            and:[ parent isMessage ]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1495
        ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1496
            "/ completion after a variable node...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1497
            parent isKeyword ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1498
                "/ and it is a keyword message, we complete the keyword message instead
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1499
                node := parent.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1500
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1501
                "/ otherwise, a unary message is probably intended to be sent to the variable.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1502
                "/ (however, no character is available to determine what is useful)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1503
                forceNewMessageSend := true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1504
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1505
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1506
            (node isMessage and:[node isUnary]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1507
                "/ expanding <rcvr> foo |<- cursor here (i.e. a space after foo)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1508
                "/
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1509
                forceNewMessageSend := true.
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1510
"/                "/ can we see what we get from foo?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1511
"/                classOfReceiver := self
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1512
"/                                    classOfReceiver:node receiver
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1513
"/                                    inClass:classOrNil instance:instanceOrNil context:contextOrNil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1514
"/                classOfReceiver notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1515
"/                    |mthd|
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1516
"/
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1517
"/                    mthd := classOfReceiver lookupMethodFor:node selector.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1518
"/                    mthd notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1519
"/                        self halt.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1520
"/                        (ParseTreeSearcher isDefinitelyGetterMethod:mthd) ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1521
"/                            forceNewMessageSend := true.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1522
"/                        ]
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1523
"/                    ]
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1524
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1525
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1526
        ]
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1527
    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1528
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1529
    forceNewMessageSend ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1530
        "/ completion with nothing to start (right after a variable)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1531
        "/ see what the variable can understand and present the most useful stuff (very thin ice here)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1532
        classOfReceiver := self classOfNode:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1533
        classOfReceiver isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1534
            "/ it does not make sense to offer anything, if we don't have any idea of what this
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1535
            "/ will be...
5687
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
  1536
            Screen current beepInEditor.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1537
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1538
            |superClass possible choice|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1539
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1540
            possible := classOfReceiver selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1541
            superClass := classOfReceiver superclass.
4938
bedac0cfaf04 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4936
diff changeset
  1542
            [superClass notNil "and:[(possible size + superClass selectors size) < 500]"] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1543
                possible := possible,superClass selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1544
                superClass := superClass superclass.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1545
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1546
            possible := possible copy sort.
4938
bedac0cfaf04 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4936
diff changeset
  1547
            choice := self askUserForCompletion:('Message to "%1"' bindWith:node formattedCode) for:codeView from:possible.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1548
            choice isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1549
                Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1550
                ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1551
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1552
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1553
            codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1554
                undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1555
                    codeView insertStringAtCursor:choice
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1556
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1557
                info:'Completion'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1558
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1559
        ^ self
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1560
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1561
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1562
    node isVariable ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1563
        self codeCompletionForVariable:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1564
        ^ self.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1565
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1566
    node isLiteral ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1567
        node value isSymbol ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1568
            self codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1569
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1570
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1571
        ^ self "/ huh - strings or what?
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1572
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1573
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1574
    checkedNode := node.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1575
    [checkedNode notNil] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1576
        checkedNode isMessage ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1577
            "/ completion in a message-send
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1578
            contextOrNilArg notNil ifTrue:[
4329
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1579
"/                |rcvrNode idx rcvr val|
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1580
"/
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1581
"/                (rcvrNode := checkedNode receiver) isVariable ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1582
"/                    rcvrNode isSelf ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1583
"/                        classOrNil := contextOrNil receiver class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1584
"/                    ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1585
"/                        (idx := contextOrNil argAndVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1586
"/                            val := contextOrNil argsAndVars at:idx.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1587
"/                            classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1588
"/                        ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1589
"/                            (idx := contextOrNil receiver class allInstVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1590
"/                                val := contextOrNil receiver instVarNamed:rcvrNode name.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1591
"/                                classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1592
"/                            ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1593
"/                        ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1594
"/                    ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1595
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1596
                instanceOrNilArg := contextOrNilArg receiver
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1597
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1598
            self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1599
                codeCompletionForMessage:checkedNode
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1600
                inClass:classOrNil instance:instanceOrNilArg
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1601
                context:contextOrNilArg codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1602
            ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1603
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1604
        checkedNode isMethod ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1605
            "/ completion in a method's selector pattern
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1606
            self codeCompletionForMethodSpec:checkedNode.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1607
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1608
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1609
        checkedNode := checkedNode parent.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1610
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1611
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1612
    self information:'Node is neither variable nor message.'.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1613
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1614
    "Created: / 18-09-2013 / 15:25:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1615
!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1616
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1617
codeCompletionForSmalltalkMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1618
    "provide code completion information by analyzing what the editing state is in codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1619
     (cursor position, characters around cursor etc.) and calling back into actionBlock, passing
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1620
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1621
     The interface has been defined in that way 
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1622
     (and tight coupling with internals of the editor) 
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1623
     because
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1624
        1) the completer needs to know about the text around the cursor position
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1625
        2) the edit operation for completion may be non-trivial
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1626
           (although not yet fully implemented, non-local rewrite procedures may and will be added in the future)
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1627
           
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1628
     For example, in many situations, both a completion of a unary selector before the cursor,
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1629
     or adding another keyword part after the cursor is possible.
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1630
     Thus, this provides a list of completions PLUS a list of edit operations (as per completion), 
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1631
     to perform the completion.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1632
     The caller has to open a dialog, providing the suggestions, and perform the corresponding edit operation.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1633
     An additional array containing a textual description for each suggestion is also provided, which could
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1634
     be shown as info or appended to the suggestions (such as 'complete variable', 'complete keyword', etc.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1635
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1636
     ContextOrNil is the current context, if this is called from the debugger;
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1637
     or nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1638
     If nonNil, we can make better guesses, because we actually know what a variable's type is"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1639
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1640
    |crsrPos char interval i source partialSource cursorLineSource
6158
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1641
     suggestions actions title suggestionCollector selectorEndsWithColon|
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1642
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1643
    languageOrNil := SmalltalkLanguage instance.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1644
    methodOrNil := methodOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1645
    classOrNil := classOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1646
    codeView := codeViewArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1647
    contextOrNil := contextOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1648
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1649
"/    classOrNil isNil ifTrue:[
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1650
"/        self information:'No class'.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1651
"/        ^ self.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1652
"/    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1653
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1654
    crsrPos := codeView characterPositionOfCursor.
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  1655
    char := codeView characterAtCharacterPosition:(crsrPos-1 max:1).
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1656
    [crsrPos > 1 and:[char isSeparator "or:['.' includes:char]"]] whileTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1657
        crsrPos := crsrPos - 1.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1658
        char := codeView characterAtCharacterPosition:crsrPos.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1659
    ].
4711
1c2e635489e5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4710
diff changeset
  1660
    char == $. ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1661
        "/ either at end of statement or after a character constant
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1662
        crsrPos == 1 ifTrue:[^ self].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1663
        (codeView characterAtCharacterPosition:crsrPos-1) == $$ ifFalse:[^ self].
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1664
    ].
6158
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1665
    selectorEndsWithColon := (codeView characterAtCharacterPosition:crsrPos) == $:.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1666
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1667
    suggestionCollector :=
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1668
        [:listOfSuggestions :listOfActionsOrBlock :titleWhenAsking|
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1669
            
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1670
            "/ may be called multiple times!!
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1671
            "/ may also be called for duplicate suggestions!!
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1672
            suggestions isNil ifTrue:[
6158
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1673
                suggestions := #().
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1674
                actions := #().
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1675
            ].    
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1676
            suggestions := suggestions asOrderedCollection.
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1677
            actions isBlock ifTrue:[
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1678
                actions := Array new:(suggestions size) withAll:actions.
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1679
            ].
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1680
            actions := actions asOrderedCollection.
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1681
            listOfSuggestions doWithIndex:[:suggestion :idx |
6163
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1682
                suggestion notNil ifTrue:[
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1683
                    (suggestions includes:suggestion) ifFalse:[
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1684
                        (selectorEndsWithColon not or:[suggestion endsWith:$:]) ifTrue:[
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1685
                            suggestions add:suggestion.
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1686
                            listOfActionsOrBlock isBlock ifTrue:[
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1687
                                actions add:listOfActionsOrBlock.
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1688
                            ] ifFalse:[
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1689
                                actions add:(listOfActionsOrBlock at:idx).
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1690
                            ]
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1691
                        ]
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1692
                    ]
6158
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1693
                ]
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1694
            ].
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1695
            title := titleWhenAsking.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1696
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1697
        
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1698
    interval := crsrPos-1 to:crsrPos.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1699
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1700
    source := codeView contentsAsString string.
6158
0245bdc85be8 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6149
diff changeset
  1701
    partialSource := source copyToMax:crsrPos-1.
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1702
    partialSource isWhitespace ifTrue:[^ self].
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1703
    
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1704
    methodOrNilArg isNil ifTrue:[
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1705
        (partialSource endsWith:Character cr) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1706
            partialSource := partialSource copyButLast.
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1707
        ].    
5504
dbae466ee892 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5502
diff changeset
  1708
        cursorLineSource := partialSource copy.
dbae466ee892 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5502
diff changeset
  1709
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1710
        "/ this cares for doIt expressions in the last cursor line;
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1711
        "/ however, we skip this, if the source starts with a lowercase letter
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1712
        "/ (then it is likely, that the user wants to define a new method)
5552
2fe0fa28ecf5 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5551
diff changeset
  1713
        (partialSource isLowercaseFirst) ifFalse:[
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1714
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1715
            "/ first try parsing the current cursor line.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1716
            "/ this helps doIts in a workspace, where additional garbage is often before the actual expression to be evaluated
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1717
            (i := partialSource lastIndexOf:Character cr) ~~ 0 ifTrue:[
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1718
                "/ because cursorPositions and node-positions are required elsewhere to be correct,
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1719
                "/ I cannot just snip off the line and parse that one alone (later corrections will do so at wrong position).
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1720
                "/ Instead, create a copy of the whole source, with the stuff before the cursor line being blanked out.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1721
                "/ However, because somewhere else, we fetch characters from the codeView using the index,
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1722
                "/ we must preserve the line structure (i.e. keep crs).
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1723
                1 to:i do:[:pos | 
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1724
                    (cursorLineSource at:pos) ~= Character cr ifTrue:[
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1725
                        cursorLineSource at:pos put:Character space.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1726
                    ]
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1727
                ].
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1728
            ].    
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1729
            self
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1730
                tryCodeCompletionWithSource:cursorLineSource nodeInterval:interval
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1731
                at:crsrPos mustBeExpression:true
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1732
                into:suggestionCollector.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1733
        ].
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1734
    ].
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1735
    
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1736
    true "suggestions isNil" ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1737
        "/ try parsing the partial source (from beginning up to the cursor)
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1738
        self
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1739
            tryCodeCompletionWithSource:partialSource nodeInterval:interval
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1740
            at:crsrPos mustBeExpression:(classOrNilArg isNil and:[methodOrNilArg isNil])
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1741
            into:suggestionCollector.
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1742
    ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1743
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1744
    true "suggestions isEmptyOrNil" ifTrue:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1745
        "/ try parsing the whole source
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1746
        self
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1747
            tryCodeCompletionWithSource:source nodeInterval:interval
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1748
            at:crsrPos mustBeExpression:false
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1749
            into:suggestionCollector
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1750
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1751
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1752
    suggestions isEmptyOrNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1753
        "/ nothing found
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1754
        ^ self
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1755
    ].    
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1756
    actionBlock value:suggestions value:actions value:title.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1757
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1758
    "Created: / 18-09-2013 / 15:25:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5552
2fe0fa28ecf5 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5551
diff changeset
  1759
    "Modified: / 22-06-2017 / 06:56:30 / cg"
5931
80a7c9e6b672 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5911
diff changeset
  1760
    "Modified: / 02-11-2018 / 20:17:48 / Claus Gittinger"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1761
! !
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1762
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  1763
!DoWhatIMeanSupport methodsFor:'code completion - helpers'!
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1764
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1765
askUserForCompletion:what for:codeView at:position from:allTheBest
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1766
    |list choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1767
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1768
    "/ cg: until the new stuff works,...
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1769
    ^ self old_askUserForCompletion:what for:codeView from:allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1770
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1771
"/    allTheBest isEmpty ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1772
"/        ^ nil
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1773
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1774
"/    allTheBest size == 1 ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1775
"/        ^ allTheBest first
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1776
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1777
"/    list := allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1778
"/    LastChoices notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1779
"/        lastChoice := LastChoices at:what ifAbsent:nil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1780
"/        lastChoice notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1781
"/            list := { lastChoice allBold } , (list copyWithout:lastChoice).
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1782
"/        ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1783
"/    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1784
"/    choice := Tools::CodeCompletionMenu
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1785
"/                openFor:codeView
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1786
"/                at:position
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1787
"/                with:allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1788
"/    LastChoices isNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1789
"/        LastChoices := Dictionary new.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1790
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1791
"/    LastChoices at:what put:choice.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1792
"/    ^ choice string
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1793
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1794
    "Created: / 16-02-2010 / 10:09:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1795
    "Modified: / 28-08-2013 / 16:41:35 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1796
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1797
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1798
askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1799
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1800
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1801
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1802
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1803
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1804
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1805
    LastChoices notNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1806
	lastChoice := LastChoices at:what ifAbsent:nil.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1807
	lastChoice notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1808
	    list := {lastChoice. nil. } , (list copyWithout:lastChoice).
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1809
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1810
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1811
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1812
    list size < 30 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1813
	|menu idx exitKey|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1814
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1815
	menu := PopUpMenu labels:list.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1816
	menu hideOnKeyFilter:[:key | |hide|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1817
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1818
		hide ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1819
		    exitKey := key.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1820
		].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1821
		hide].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1822
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1823
	idx := menu startUp.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1824
	idx == 0 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1825
	    exitKey notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1826
		codeView keyPress:exitKey x:0 y:0.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1827
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1828
	    ^ nil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1829
	].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1830
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1831
    ] ifFalse:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1832
	resources := codeView application isNil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1833
			ifTrue:[ codeView resources]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1834
			ifFalse:[ codeView application resources ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1835
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1836
	choice := Dialog
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1837
	   choose:(resources string:'Choose ',what)
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1838
	   fromList:list
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1839
	   lines:20
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1840
	   title:(resources string:'Code completion').
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1841
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1842
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1843
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1844
    LastChoices isNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1845
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1846
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1847
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1848
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1849
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1850
    "Created: / 10-11-2006 / 14:00:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1851
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1852
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1853
codeCompletionForBlockArgument:node into:actionBlock
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1854
!
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1855
5900
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1856
codeCompletionForLiteralString:partialString node:node considerAll:considerAll into:actionBlock
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1857
    "/ nothing done here, but redefined in subclasses which may (i.e. expecco code completer)
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1858
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1859
    "Created: / 29-08-2018 / 16:31:22 / Claus Gittinger"
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1860
!
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1861
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1862
codeCompletionForLiteralString:partialString node:node in:source considerAll:considerAll into:actionBlock
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1863
    "/ nothing done here, but redefined in subclasses which may (i.e. expecco code completer)
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1864
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1865
    "Created: / 29-08-2018 / 16:47:28 / Claus Gittinger"
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1866
!
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  1867
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1868
codeCompletionForLiteralSymbol:nodeOrNil element:tokenOrNil considerAll:considerAll into:actionBlock
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1869
    "looking for all symbols is way too much and imprecise;
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1870
     experiment: only present symbols which are used by the class,
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1871
     and classes in that class category, or at least: implemented as method.
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1872
     We'll see..."
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1873
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1874
    |sym possibleCompletions longest editAction start stop addSymbol
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1875
     parentSelector parent symbolSelectorClass|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1876
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  1877
    "/ Transcript show:'lit in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1878
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1879
    start := (nodeOrNil ? tokenOrNil) start.
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1880
    stop := (nodeOrNil ? tokenOrNil) stop.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1881
    (codeView characterAtCharacterPosition:stop) == $' ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1882
        ^ self.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1883
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1884
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1885
    sym := (nodeOrNil ? tokenOrNil) value.
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1886
    possibleCompletions := Set new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1887
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1888
    addSymbol :=
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1889
        [:aSymbol |
6163
e1e3c7f297ac #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6158
diff changeset
  1890
            aSymbol isNil ifTrue:[self halt].
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1891
            (aSymbol startsWith:sym) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1892
                (aSymbol = sym) ifFalse:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1893
                    possibleCompletions add:aSymbol
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1894
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1895
            ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1896
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1897
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1898
    (nodeOrNil notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1899
    and:[ (parent := nodeOrNil parent) notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1900
    and:[ parent isMessage ]]) ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1901
        parentSelector := parent selector.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1902
        ( #( perform: perform:ifNotUnderstood: ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1903
            symbolSelectorClass := self classOfNode:parent receiver.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1904
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1905
        ( #( #'onChangeSend:' ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1906
            "/ assume that send-target will be self.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1907
            (methodOrNil notNil and:[ methodOrNil selector notNil and:[ methodOrNil selector isUnarySelector ]]) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1908
                addSymbol value:(methodOrNil selector,'Changed').
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1909
            ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1910
            symbolSelectorClass := classOrNil.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1911
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1912
        ( #( #'onChangeSend:to:' ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1913
            symbolSelectorClass := self classOfNode:parent arguments second.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1914
        ].
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1915
5074
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1916
        "/ actually, I found that this gives good suggestions.
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1917
        symbolSelectorClass isNil ifTrue:[
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1918
            symbolSelectorClass := classOrNil.
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1919
        ].
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1920
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1921
        symbolSelectorClass notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1922
            symbolSelectorClass withAllSuperclassesDo:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1923
                cls ~~ Object ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1924
                    cls ~~ Model ifTrue:[
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  1925
                        cls selectorsDo:addSymbol.
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1926
                    ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1927
                ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1928
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1929
        ].
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1930
    ].
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1931
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1932
    (considerAll or:[classOrNil isNil]) ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1933
        Smalltalk allClassesDo:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1934
            cls theNonMetaclass methodDictionary keys do:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1935
            cls theMetaclass methodDictionary keys do:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1936
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1937
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1938
        "/ Symbol allInstancesDo:addSymbol.
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1939
    ] ifFalse:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1940
        Smalltalk allClassesInCategory:classOrNil do:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1941
            cls theNonMetaclass instAndClassMethodsDo:[:mthd |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1942
                mthd usedSymbols do:addSymbol
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1943
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1944
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1945
    ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1946
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1947
    "/ add symbolic literals (especially for spec methods)
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1948
    classOrNil notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1949
        classOrNil theMetaclass instAndClassMethodsDo:[:mthd |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1950
            mthd literalsDo:[:lit |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1951
                lit isSymbol ifTrue:[ addSymbol value: lit ]
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1952
            ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1953
        ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1954
    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1955
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1956
    possibleCompletions := possibleCompletions asOrderedCollection sort.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1957
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1958
    longest := possibleCompletions longestCommonPrefix.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1959
    possibleCompletions remove:longest ifAbsent:[].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1960
    possibleCompletions addFirst: longest.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1961
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1962
    editAction :=
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1963
        [:chosenIndex |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1964
            |chosen oldSym oldLen newLen|
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1965
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1966
            chosen := possibleCompletions at:chosenIndex.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1967
            chosen notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1968
                (codeView characterAtCharacterPosition:start) == $# ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1969
                    start := start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1970
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1971
                (codeView characterAtCharacterPosition:start) == $' ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1972
                    start := start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1973
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1974
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1975
                oldSym := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1976
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1977
                codeView
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1978
                    undoableDo:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1979
                        codeView replaceFromCharacterPosition:start to:stop with:chosen
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1980
                    ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1981
                    info:'Completion'.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1982
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1983
                (chosen startsWith:oldSym) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1984
                    oldLen := stop - start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1985
                    newLen := chosen size.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1986
                    codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1987
                    codeView dontReplaceSelectionOnInput
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1988
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1989
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1990
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1991
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1992
    actionBlock value:possibleCompletions value:editAction value:'symbol'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1993
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1994
    "Modified: / 16-02-2010 / 10:15:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  1995
    "Modified: / 10-02-2017 / 10:32:54 / cg"
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1996
    "Modified (comment): / 17-05-2017 / 12:13:33 / mawalch"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1997
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1998
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1999
codeCompletionForMessage:node into:actionBlock
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  2000
    "find good completions for a message selector in a message-send node"
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  2001
    
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2002
    |selector lcSelector selectorWithoutColon lcSelectorWithoutColon
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2003
     bestSelectors parentSelector newParentSelector bestSelectors2 bestWithParenthesis allBest numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2004
     newParts nSelParts oldLen newLen selectorParts
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2005
     parentNode nodeReceiver "selectorsSentInCode" selectorsImplementedInClass
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2006
     editAction parentNodeClassIfKnown
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2007
     receiverNodeClassIfKnown 
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2008
     offerParenthisationAroundNode parenthesisAroundIndex parentNodeToParenthesize
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2009
     offerValueInsertion valueToInsert valueToInsertIndex valueInfo
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2010
     classesFromAssignmentsToReceiver otherMessagesToReceiver
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2011
     canParenthesize classesOfReceiver|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2012
 
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2013
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2014
        Transcript show:'node '; show:node; show:' ; '.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2015
        Transcript show:'msg in '; show:methodOrNil; show:' / '; showCR:classOrNil.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2016
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2017
    
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2018
    offerParenthisationAroundNode := nil.
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2019
    offerValueInsertion := false.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2020
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2021
    selector := node selector.
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2022
    lcSelector := selector asLowercase.
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2023
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2024
    selectorWithoutColon := selector.
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2025
    lcSelectorWithoutColon := lcSelector.
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2026
    (selectorWithoutColon includes:$:) ifTrue:[
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2027
        selectorWithoutColon := selector upTo:$:.
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2028
    ].    
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2029
    (lcSelectorWithoutColon includes:$:) ifTrue:[
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2030
        lcSelectorWithoutColon := lcSelector upTo:$:.
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2031
    ].    
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2032
        
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2033
    parentNode := node parent.
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  2034
    nodeReceiver := node receiver.
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2035
    nodeReceiver notNil ifTrue:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2036
        classesOfReceiver := self classesOfNode:nodeReceiver.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2037
    ].
6036
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  2038
    "/ Verbose := true
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2039
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2040
        Transcript show:node; show:' -> '; showCR:classesOfReceiver.
5738
59d8e9757a0f #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5714
diff changeset
  2041
        ( node isVariable and:[node name = 'self']) ifTrue:[self breakPoint:#cg].
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2042
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2043
    
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2044
    "/ if there is already space before the cursor, and the parent node is not a message,
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2045
    "/ do not attempt to complete the current message.
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2046
    "/ If it is a message, we will look for parent-message completion also below (best2 stuff)
5385
730032499904 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5379
diff changeset
  2047
    (codeView characterBeforeCursor ? Character space) isSeparator ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2048
        selector isKeyword ifFalse:[
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2049
            self codeCompletionForMessageTo:node into:actionBlock.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2050
            ^ self
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2051
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2052
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2053
 
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2054
    "/ only do this if the node-message has no parents around
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2055
    node parentheses isEmptyOrNil ifTrue:[
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2056
        Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2057
            Transcript show:'try for: '; showCR:nodeReceiver
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2058
        ].    
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2059
        bestSelectors := self findBest:nodeReceiver for:selector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2060
                              inClasses:classesOfReceiver
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2061
    ] ifFalse:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2062
        bestSelectors := OrderedCollection new.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2063
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2064
 
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2065
    "/ if the receiver is a real variable,
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  2066
    "/ we can look for other messages being sent to that variable in the current method.
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2067
    "/ Also, if there are assignments to it (like constants or '<class> new'), use that as a hint...
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2068
    (tree notNil
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2069
        and:[ nodeReceiver isVariable
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2070
        and:[ nodeReceiver isSelf not
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2071
        and:[ nodeReceiver isSuper not ]]])
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2072
    ifTrue:[
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2073
        |receiverName possibleClasses possibleClassesFromOtherSends|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2074
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2075
        receiverName := nodeReceiver name.
5486
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2076
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2077
        classesOfReceiver notEmptyOrNil ifTrue:[ 
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2078
            possibleClasses := classesOfReceiver.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2079
        ] ifFalse:[    
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2080
            classesFromAssignmentsToReceiver := self classesFromAssignmentTo:receiverName in:tree.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2081
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2082
            possibleClasses := classesFromAssignmentsToReceiver.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2083
            possibleClasses isEmpty ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2084
                "/ messages sent
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2085
                otherMessagesToReceiver := self messagesSentTo:receiverName in:tree.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2086
                otherMessagesToReceiver remove:selector ifAbsent:[].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2087
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2088
                otherMessagesToReceiver notEmpty ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2089
                    "/ classes which respond to all
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2090
                    possibleClassesFromOtherSends :=
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2091
                        Smalltalk 
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2092
                            allClassesForWhich:[:cls |
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2093
                                cls isLoaded
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2094
                                and:[ otherMessagesToReceiver
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2095
                                        conform:[:eachSelectorSent | cls canUnderstand:eachSelectorSent]]
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2096
                            ].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2097
                    possibleClasses := possibleClasses , possibleClassesFromOtherSends.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2098
                ].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2099
            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2100
 
5486
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2101
            "/ if the receiver is a classVar/classInstVar,
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2102
            "/ include the class of its current value and UndefinedObject.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2103
            "/ This helps to complete class methods and (lazy) initializer code.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2104
            (classOrNil notNil) ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2105
                |tryValue currentValue|
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2106
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2107
                tryValue := false.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2108
                (classOrNil theNonMetaclass allClassVarNames includes: receiverName) ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2109
                    tryValue := true.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2110
                    currentValue := classOrNil theNonMetaclass classVarAt:receiverName.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2111
                ] ifFalse:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2112
                    (classOrNil isMeta and:[ classOrNil allInstVarNames includes: receiverName ]) ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2113
                        tryValue := true.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2114
                        currentValue := classOrNil theNonMetaclass instVarNamed:receiverName.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2115
                    ].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2116
                ].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2117
                tryValue ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2118
                    possibleClasses := { currentValue class } , possibleClasses.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2119
                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2120
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2121
        ].
5486
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2122
        
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2123
        (possibleClasses notEmpty and:[possibleClasses size < 15]) ifTrue:[
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2124
            bestSelectors :=
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2125
                (possibleClasses 
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2126
                    collectAll:[:eachClass |
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2127
                        Parser findBest:30 selectorsFor:selector in:eachClass forCompletion:true.
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2128
                    ] as:Set) asOrderedCollection.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2129
 
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2130
            "/ if any of those is a prefix-keyword of the selector,
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2131
            "/ do not offer it (i.e. ifTrue:ifFalse: is already present, don't offer ifTrue:ifFalse: again.
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2132
            bestSelectors := bestSelectors reject: [:sel | 
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2133
                                (selector startsWith: sel) or: [selector endsWith: sel]
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2134
                             ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2135
        ].
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2136
    ].                                                                            
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2137
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2138
    "/ if we are behind a keyword messages colon,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2139
    "/ only look for matching prefix selectors;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2140
    "/ also, a good completion is to insert an argument;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2141
    "/ the name of the variable from the implementation, as comment, and selected might be a good one!!
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2142
    "/ Array new:1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2143
    selector isKeyword ifTrue:[
5385
730032499904 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5379
diff changeset
  2144
        (node arguments size = selector argumentCount) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2145
            offerParenthisationAroundNode := node. 
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2146
            "/ Transcript show:'2:'; showCR:node.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2147
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2148
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2149
        codeView characterBeforeCursor == $: ifTrue:[
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2150
            (bestSelectors select:[:sel | sel asLowercase startsWith:lcSelectorWithoutColon]) isEmpty ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2151
                "/ nothing better around
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2152
                |argIndex argNames argNameStrings impls|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2153
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2154
                argIndex := node selectorParts size.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2155
                argNames := Set new.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2156
                argNameStrings := OrderedCollection new.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2157
                impls := Smalltalk allImplementorsOf:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2158
                impls size < 10 ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2159
                    impls do:[:eachImplClass |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2160
                        |mthd argName|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2161
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2162
                        mthd := (eachImplClass compiledMethodAt:selector).
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2163
                        argName := (mthd methodArgNames ? #()) at:argIndex ifAbsent:nil.
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2164
                        argName notNil ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2165
                            (argNames includes:argName) ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2166
                                argNames add:argName.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2167
                                argNameStrings add:(argName allItalic,' hint only: argName in (' ,mthd mclass name allBold,' ',mthd methodDefinitionTemplate).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2168
                            ].    
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2169
                        ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2170
                    ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2171
                    argNameStrings notEmptyOrNil ifTrue: [
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2172
                        argNameStrings := argNameStrings asOrderedCollection sort.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2173
                        actionBlock value:argNameStrings value:[:selIndex | ] value: 'argument name hint'.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2174
                        ^ self.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2175
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2176
                ]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2177
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2178
        ].
4369
810a78e62f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  2179
    ] ifFalse:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2180
        "/ when completing a non-keyword AND the parent is a keyword message,
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2181
        "/ only consider longer keyword messages or unary messages.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2182
        "/ unless the node is parenthesized
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2183
        node hasParentheses ifFalse:[ 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2184
            (parentNode notNil and:[ parentNode isKeywordMessage ]) ifTrue:[
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2185
                bestSelectors := bestSelectors select:[:sel |
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2186
                                    sel isUnarySelector 
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2187
                                    or:[ sel startsWith:parentNode selector]
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2188
                                 ]
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2189
            ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2190
        ]
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2191
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2192
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2193
"/    bestSelectors := bestSelectors asOrderedCollection.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2194
"/    bestSelectors sort:[:a :b | a size < b size].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2195
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2196
    (selector isUnarySelector and:[ parentNode notNil and:[ parentNode isMessage ]]) ifTrue:[
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2197
        (parentSelector := parentNode selector) isKeyword ifTrue:[
5471
289b60e70a2c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5462
diff changeset
  2198
            "/ if it's a unary message AND the parent is a keyword node, look for parent completion too.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2199
            "/ i.e. look if there is a longer keyword possible
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2200
            newParentSelector := parentSelector,selector.
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2201
            bestSelectors2 := self 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2202
                                findBest:(parentNode receiver) for:newParentSelector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2203
                                inClasses:(self classesOfNode:parentNode receiver).
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2204
            bestSelectors2 := bestSelectors2 select:[:sel | sel isKeyword and:[ sel startsWith:parentSelector]].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2205
            bestSelectors2 := bestSelectors2 asOrderedCollection sort:[:a :b | a size < b size].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2206
            bestSelectors := bestSelectors reject:[:sel | bestSelectors2 includes:sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2207
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2208
            "/ if the parent has a valid selector, offer parenthization
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2209
            (Smalltalk someImplementorOf:parentSelector) notNil ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2210
                offerParenthisationAroundNode := parentNode.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2211
                "/ Transcript show:'2:'; showCR:parentNode.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2212
            ].
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2213
            parentSelector := newParentSelector.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2214
        ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2215
            |kwSels|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2216
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2217
            "/ if its a unary message AND the parent is a unary or binary node, 
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2218
            "/ try again, sending the partial message
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2219
            "/ as a keyword to the parent node.
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2220
            "/ this is the case when after "foo binOp bar if", or "foo unOp bar if"
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2221
            "/ which should include ifTrue: in the suggestion result.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2222
            
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2223
            "/ suggestion will transform from (the incorrectly parsed)
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2224
            "/    foo == (shift if)
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2225
            "/
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2226
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2227
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2228
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2229
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2230
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2231
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2232
            "/           arg
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2233
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2234
            "/ into:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2235
            "/    (foo == shift) if
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2236
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2237
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2238
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2239
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2240
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2241
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2242
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2243
            "/           arg
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2244
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2245
            "/ but only do this, if typing to the end of the parent message
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2246
            "/ (i.e. after (foo == shift) <-
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2247
            "/    or after foo bar baz <-
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2248
            "/ not if typing into an existing message
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2249
            "/ (i.e. into foo == shift <- more
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2250
            "/    or into foo bar <- baz
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2251
            codeView characterPositionOfCursor >= parentNode stop ifTrue:[
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2252
                kwSels := self 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2253
                                findBest:parentNode for:selector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2254
                                inClasses:(self classesOfNode:parentNode).
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2255
                kwSels := kwSels select:[:sel | sel isKeyword].
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2256
     
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2257
                kwSels := kwSels asOrderedCollection sort:[:a :b | a size < b size].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2258
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2259
                bestSelectors := bestSelectors reject:[:sel | kwSels includes:sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2260
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2261
                "/ these need to go to bestSelectors (see editAction)
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2262
                parentNodeClassIfKnown := self classOfNode:parentNode.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2263
                (parentNodeClassIfKnown notNil and:[ parentNodeClassIfKnown includesBehavior: Boolean ]) ifTrue:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2264
                    "/ this is so common, that it deserves a special case:
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2265
                    "/ if we complete an 'if' after some boolean message e.g '(a == b) if'
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2266
                    "/ throw out the very unlikely ifNil, ifEmpty etc. messages (which are inherited by Object, but absolutely unrealistic)
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2267
                    bestSelectors := self
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2268
                                        withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2269
                                        from:bestSelectors
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2270
                                        forPartial:selector.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2271
                    kwSels := self
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2272
                                withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2273
                                from:kwSels
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2274
                                forPartial:selector.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2275
     
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2276
                    "/ put keyword selectors in front, because they are very likely
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2277
                    bestSelectors := kwSels , bestSelectors.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2278
                ] ifFalse:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2279
                    "/ put them at the end
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2280
                    bestSelectors := bestSelectors , kwSels.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2281
                ].
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2282
            ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2283
        ]
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2284
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2285
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2286
    (selector isUnarySelector and:[ node isMessage ]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2287
        receiverNodeClassIfKnown := self classOfNode:nodeReceiver.
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2288
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2289
        (receiverNodeClassIfKnown notNil) ifTrue:[
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2290
            true "(receiverNodeClassIfKnown includesBehavior: Boolean)" ifTrue:[
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2291
                bestSelectors := bestSelectors select:[:sel | receiverNodeClassIfKnown canUnderstand:sel].
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2292
                bestSelectors := self
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2293
                                    withoutSelectorsUnlikelyFor:receiverNodeClassIfKnown
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2294
                                    from:bestSelectors
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2295
                                    forPartial:selector.
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2296
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2297
        ].
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  2298
    ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2299
    
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2300
    Verbose == true ifTrue:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2301
        Transcript show:'parentNode: '; showCR:parentNode.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2302
        Transcript show:'parentNode: '; showCR:parentNode class.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2303
        Transcript show:'sel: '; showCR:selector.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2304
    ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2305
    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2306
    canParenthesize := false.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2307
    parentNode notNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2308
        parentNode isMessage ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2309
            (((parentNode selector isUnarySelector not) and:[selector isUnarySelector])
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2310
            or:[ ((parentNode selector isKeyword) and:[selector isBinarySelector]) ]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2311
                canParenthesize := true.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2312
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2313
        ] ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2314
            offerParenthisationAroundNode isNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2315
                selector isKeyword ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2316
                    offerParenthisationAroundNode := node.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2317
                ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2318
            ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2319
        ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2320
    ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2321
    canParenthesize ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2322
        "/ completing an already existing keyword or binary message with something starting with
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2323
        "/ if, and, or or while.
5203
9b8272cc6d49 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5146
diff changeset
  2324
        "/ Here, offer a special completion which inserts parentheses / brackets around the already
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2325
        "/ existing message. Do this only, if the existing message makes sense.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2326
        "/    expr wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2327
        "/ ->
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2328
        "/    [expr] whileXX:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2329
        true "((
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2330
            #( 'ifTrue' 'ifFalse' 'and' 'or' 'do' 'keysAndValuesDo' 'whileTrue' 'whileFalse' 'ensure' 'on')
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2331
        ) contains:[:part | part startsWith:selector])" ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2332
            (Smalltalk someImplementorOf:parentNode selector) notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2333
                |selsP selsB|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2334
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2335
                selsP := #( 'ifTrue:' 'ifFalse:' 'and' 'or' 'do' 'keysAndValuesDo' )
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2336
                            select:[:sel | sel startsWith:selector]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2337
                            thenCollect:[:sel | '(',parentNode selector,') ',sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2338
                ( #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' ) contains:[:sel | sel startsWith:selector]) 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2339
                ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2340
                    selsP := selsP copyWith:'(',parentNode selector,') ',selector  
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2341
                ]. 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2342
                selsB := #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' )
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2343
                            select:[:sel | sel startsWith:selector]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2344
                            thenCollect:[:sel | '[',parentNode selector,'] ',sel].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2345
                parentNodeToParenthesize := parentNode.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2346
                bestWithParenthesis := selsP , selsB.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2347
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2348
        ].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  2349
    ] ifFalse:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2350
        "/ also offer adding brackets for a while expression
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2351
        "/    expr wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2352
        "/ ->
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2353
        "/    [expr] whileXX:[]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2354
        ((
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2355
            #( 'whileTrue' 'whileFalse' 'ensure' 'on')
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2356
        ) contains:[:part | part startsWith:selector]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2357
            (node receiver isBlock) ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2358
                |sels|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2359
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2360
                (node receiver isMessage not
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2361
                or:[ (Smalltalk someImplementorOf:node receiver selector) notNil ]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2362
                    sels := #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' )
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2363
                                select:[:sel | sel startsWith:selector]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2364
                                thenCollect:[:sel | '[...] ',sel].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2365
                    parentNodeToParenthesize := node receiver.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2366
                    bestWithParenthesis := sels.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2367
                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2368
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2369
        ].
4416
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2370
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2371
 
5419
7ba6ce8016c2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5392
diff changeset
  2372
    allBest := (bestSelectors ? #()) , (bestSelectors2 ? #()) asOrderedCollection.
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2373
    self sortSelectors:allBest forSelector:selectorWithoutColon lcSelector:lcSelectorWithoutColon.
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2374
                        
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2375
    "/ sort: prefixes first.
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2376
    parentSelector notNil ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2377
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2378
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2379
                    by:[:sel | 
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2380
                            (sel asLowercase startsWith:lcSelectorWithoutColon) 
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2381
                            or:[sel startsWith:parentSelector]].
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2382
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2383
 
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2384
    "/ if receiver is super, always include the method's own selector
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  2385
    nodeReceiver isSuper ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2386
        (tree isMethod) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2387
            |mSel|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2388
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2389
            mSel := tree selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2390
            mSel notNil ifTrue:[
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2391
                (mSel startsWith:selectorWithoutColon) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2392
                    "/ already the word before the cursor?
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2393
                    (mSel ~= selector) ifTrue:[
5419
7ba6ce8016c2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5392
diff changeset
  2394
                        allBest removeAndAddFirst:mSel.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2395
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2396
                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2397
            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2398
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2399
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2400
 
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2401
    "/ another convenient hack; 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2402
    "/ if we have just typed in foo == 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2403
    "/ and the value of foo is a known literal,
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2404
    "/ offer inserting this literal. This is great in a debugger...
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2405
    ( #(#'==' #'=' #'~=' #'~~') includes:selector ) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2406
        |val|
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2407
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2408
        (val := self valueOfNode:nodeReceiver) notNil ifTrue:[
5285
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2409
            "/ this can raise an error, if val does not like to generate a storeString
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2410
            "/ (it is recursive, or an X11GraphicsContext, for example)
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2411
            Error handle:[:ex |
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2412
            ] do:[
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2413
                valueToInsert := val storeString.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2414
                offerValueInsertion := true.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2415
                nodeReceiver isVariable ifTrue:[
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2416
                    valueInfo := ' (current value of %1)' bindWith:nodeReceiver name.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2417
                ] ifFalse:[                
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2418
                    valueInfo := ' (current value of expression)'.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2419
                ].
6128
2690e07d6512 #OTHER by exept
Claus Gittinger <cg@exept.de>
parents: 6126
diff changeset
  2420
                valueInfo := valueInfo allGray.
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2421
            ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2422
        ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2423
    ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2424
    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2425
    (allBest isEmptyOrNil 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2426
        and:[bestWithParenthesis isEmptyOrNil
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2427
        and:[offerParenthisationAroundNode isNil
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2428
        and:[offerValueInsertion not]]] 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2429
    ) ifTrue:[ 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2430
        ^ self 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2431
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2432
 
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2433
"/    "/ see what is aready sent to this variable inside the code
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2434
"/    "/ and also what is assigned to it.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2435
"/    nodeReceiver notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2436
"/        nodeReceiver isVariable ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2437
"/            rememberedNodes notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2438
"/                selectorsSentInCode := 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2439
"/                    (rememberedNodes
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2440
"/                        select:[:node | 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2441
"/                            node isMessage 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2442
"/                                and:[node receiver isVariable
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2443
"/                                and:[node receiver name = nodeReceiver name]]]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2444
"/                        thenCollect:[:node | 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2445
"/                            node selector]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2446
"/                    ) asSet.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2447
"/            ] ifFalse:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2448
"/                selectorsSentInCode := Set new. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2449
"/                tree allMessageNodesDo:[:msg |
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2450
"/                    (msg receiver isVariable
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2451
"/                        and:[msg receiver name = nodeReceiver name]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2452
"/                    ) ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2453
"/                        selectorsSentInCode add:msg selector
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2454
"/                    ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2455
"/                ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2456
"/                selectorsSentInCode remove:selector ifAbsent:[].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2457
"/            ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2458
"/        ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2459
"/    ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2460
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2461
    nodeReceiver notNil ifTrue:[
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2462
        |classOrNil|
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2463
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2464
        classOrNil := self classOfNode:nodeReceiver.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2465
        classOrNil isNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2466
            classesFromAssignmentsToReceiver size == 1 ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2467
                classOrNil := classesFromAssignmentsToReceiver anElement
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2468
            ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2469
        ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2470
        classOrNil notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2471
            selectorsImplementedInClass := classOrNil selectors.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2472
"/            selectorsImplementedInClass := Set new.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2473
"/            classOrNil withAllSuperclassesDo:[:cls |
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2474
"/                cls theNonMetaclass ~~ Object ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2475
"/                    selectorsImplementedInClass addAll:cls selectors.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2476
"/                ]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2477
"/            ]    
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2478
        ]
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  2479
    ].
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  2480
    
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2481
    selectorsImplementedInClass notNil ifTrue:[
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2482
        (parentSelector notNil and:[parentSelector includes:$:]) ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2483
            selectorsImplementedInClass := selectorsImplementedInClass reject:[:sel | sel isKeywordSelector].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2484
        ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2485
        
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2486
        "/ the one's implemented in the class itself are moved to the top of the list.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2487
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2488
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2489
                    by:[:sel | selectorsImplementedInClass includes:sel].
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2490
    ].
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2491
    otherMessagesToReceiver "selectorsSentInCode" notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2492
        "/ the one's already sent in the code are moved to the top of the list.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2493
        "/ trouble is: parser bails out on error, so most of the time, we only see
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2494
        "/ selectors sent previously. sigh.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2495
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2496
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2497
                    by:[:sel | otherMessagesToReceiver "selectorsSentInCode" includes:sel].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2498
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2499
 
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2500
    (parentSelector notNil and:[parentSelector includes:$:]) ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2501
        allBest := self 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2502
                    splitSelectorList:allBest 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2503
                    by:[:sel | sel startsWith:parentSelector].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2504
    ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2505
    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2506
"/ this makes it very slow
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2507
"/false ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2508
"/    srchClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2509
"/        implClass := srchClass whichClassIncludesSelector:best.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2510
"/    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2511
"/        implClass := Smalltalk allClasses select:[:cls | (cls includesSelector:best) or:[cls class includesSelector:best]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2512
"/        implClass size == 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2513
"/            implClass := implClass first.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2514
"/        ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2515
"/            implClass := nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2516
"/        ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2517
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2518
"/
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2519
"/    info := best storeString.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2520
"/    implClass notNil ifTrue:[
6128
2690e07d6512 #OTHER by exept
Claus Gittinger <cg@exept.de>
parents: 6126
diff changeset
  2521
"/        info := implClass name , ' » ' , info.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2522
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2523
"/    self information:info.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2524
"/].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2525
 
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2526
    (parentSelector notNil and:[parentSelector includes:$:]) ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2527
        "/ the one's which are a prefix are moved towards the top of the list
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2528
        allBest := self splitSelectorList:allBest 
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2529
                        by:[:sel | sel notNil and:[sel asLowercase startsWith:lcSelectorWithoutColon]].
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2530
    ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2531
    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2532
    "/ heuristic hack:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2533
    "/ 'i' and 'w' generate lists in which ifXXX / whileXXX are not at the top of the list.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2534
    "/ we know, that those are most often wanted!!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2535
    selector size <= 2 ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2536
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2537
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2538
                    by:[:sel | 
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2539
                        #(ifTrue: ifFalse: isNil notNil whileTrue whileFalse) includes:sel
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2540
                    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2541
    ]. 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2542
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  2543
    "/ sort again: prefixes must always come before
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2544
    allBest sortBySelector:#size.
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2545
    self sortSelectors:allBest forSelector:selectorWithoutColon lcSelector:lcSelectorWithoutColon.
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2546
    "/ self sortUsefulSelectorsIn:allBest. "/cosmetics
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2547
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2548
    (parentSelector notNil and:[parentSelector includes:$:]) ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2549
        allBest := (allBest 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2550
                        select:[:sel | sel startsWith:parentSelector]
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2551
                        thenCollect:[:sel | sel copyFrom:(parentSelector lastIndexOf:$:)+1])
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2552
                    ,
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2553
                    (allBest 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2554
                        reject:[:sel | sel startsWith:parentSelector]).
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2555
    ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2556
    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2557
    "/ parenthesizers always at the end.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2558
    bestWithParenthesis notEmptyOrNil ifTrue:[ 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2559
        allBest := allBest , bestWithParenthesis.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2560
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2561
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2562
    "/ self at:1 put:#foo
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2563
    "/ Array new:10
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2564
    offerParenthisationAroundNode notNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2565
        allBest := allBest copyWith:( '(',selector,')' ).
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2566
        parenthesisAroundIndex := allBest size.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2567
    ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2568
    offerValueInsertion ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2569
        allBest := allBest copyWith:( '... ',(valueToInsert contractTo:30),valueInfo). 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2570
        valueToInsertIndex := allBest size.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2571
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2572
 
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2573
    editAction :=
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2574
        [:index |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2575
            |crsrPos chosen parenthesisToInsert action|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2576
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2577
            action := nil.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2578
            crsrPos := codeView characterPositionOfCursor.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2579
            chosen := allBest at:index.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2580
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2581
            chosen ~= selector ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2582
                (bestWithParenthesis notNil and:[bestWithParenthesis includes:chosen]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2583
                    "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2584
                    "/   chosen at: 10 if
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2585
                    "/ put parenthesis around, and add ifTrue/ifFalse
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2586
                    "/ i.e.:   (chosen at:10) ifTrue:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2587
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2588
                    "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2589
                    "/   a > 10 wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2590
                    "/ put brackets around and add whileTrue/whileFalse
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2591
                    "/ i.e.:   [a > 10] whileTrue:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2592
                    parenthesisToInsert := chosen first == $( ifTrue:'()' ifFalse:'[]'.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2593
                    chosen := (chosen copyFrom:(chosen lastIndexOf:parenthesisToInsert second)+1) withoutSeparators.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2594
                ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2595
                    (offerParenthisationAroundNode notNil and:[index = parenthesisAroundIndex]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2596
                        "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2597
                        "/      Array new:10
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2598
                        "/ put parenthesis around.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2599
                        "/ i.e.:   (Array new:10)
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2600
                        action :=
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2601
                            [
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2602
                                codeView insertString:'(' atCharacterPosition:offerParenthisationAroundNode start.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2603
                                codeView insertString:')' atCharacterPosition:offerParenthisationAroundNode stop+2.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2604
                                codeView cursorToCharacterPosition:(offerParenthisationAroundNode stop+2); cursorRight.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2605
                            ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2606
                    ] ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2607
                        (offerValueInsertion and:[index = valueToInsertIndex]) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2608
                            "/ for input like: 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2609
                            "/      foo == 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2610
                            "/ insert a value
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2611
                            "/ i.e.:   foo == #someSymbol
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2612
                            action :=
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2613
                                [
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2614
                                    codeView characterBeforeCursor isSeparator ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2615
                                        codeView insertStringAtCursor:' '.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2616
                                    ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2617
                                    codeView insertStringAtCursor:valueToInsert.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2618
                                    "/ codeView cursorRight.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2619
                                ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2620
                        ]
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2621
                    ].    
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2622
                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2623
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2624
                action isNil ifTrue:[
6138
1dd5dc49a996 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 6134
diff changeset
  2625
                    numArgs := chosen argumentCount.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2626
                    (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:chosen]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2627
                        selectorParts := parentNode selectorParts , node selectorParts.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2628
                    ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2629
                        selectorParts := node selectorParts.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2630
                    ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2631
                    nSelParts := selectorParts size.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2632
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2633
                    newParts := chosen asCollectionOfSubstringsSeparatedBy:$:.
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  2634
                    newParts := newParts select:[:part | part size ~~ 0].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2635
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2636
                    action :=
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2637
                        [
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2638
                            |positionOfFirstArg newCursorPosition stop checkForArgumentTemplates
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2639
                             newPart oldPartialToken start|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2640
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2641
                            checkForArgumentTemplates := (selector isUnarySelector and:[chosen isKeywordSelector]).
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2642
                            numArgs > nSelParts ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2643
                                "/ new selector has more arguments; append them
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2644
                                stop := selectorParts last stop.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2645
                                codeView deleteFromCharacterPosition:stop+1 to:crsrPos-1.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2646
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2647
                                "/ append the rest ...
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2648
                                (numArgs min:newParts size) downTo:(nSelParts+1) do:[:idx |
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2649
                                    |newPart|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2650
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2651
                                    newPart := newParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2652
                                    newPart := newPart , ':'.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2653
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2654
                                    (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2655
                                        newPart := ':' , newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2656
                                    ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2657
                                    newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2658
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2659
                                    codeView replaceFromCharacterPosition:stop to:stop with:newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2660
                                    "/ remember the leftMost replacement's end as new cursor position
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2661
                                    newCursorPosition := stop + newPart size
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2662
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2663
                                checkForArgumentTemplates := true.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2664
                            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2665
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2666
                            "/ replace existing parts
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2667
                            (nSelParts min:newParts size) downTo:1 do:[:idx |
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2668
                                |skipColon|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2669
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2670
                                skipColon := 0.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2671
                                newPart := newParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2672
                                oldPartialToken := selectorParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2673
                                start := oldPartialToken start.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2674
                                stop := oldPartialToken stop.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2675
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2676
                                (chosen endsWith:$:) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2677
                                    (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2678
                                        newPart := newPart , ':'.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2679
                                    ] ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2680
                                        skipColon := 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2681
                                    ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2682
                                ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2683
                                    (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2684
                                        newPart := newPart , ':'
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2685
                                    ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2686
                                        |nextChar|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2687
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2688
                                        nextChar := codeView characterAtCharacterPosition:stop+1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2689
                                        nextChar isSeparator ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2690
                                            nextChar == $. ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2691
                                                newPart := newPart , ' '
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2692
                                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2693
                                        ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2694
                                    ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2695
            "/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2696
            "/                        ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2697
            "/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2698
                                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2699
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2700
                                oldPartialToken value ~= newPart ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2701
                                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2702
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2703
                                    oldLen := stop - start + 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2704
                                    newLen := newPart size.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2705
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2706
                                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2707
                                    "/ remember the leftMost replacement's end as new cursor position
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2708
                                    newCursorPosition := start + newPart size + skipColon. "/ (newLen-oldLen) + 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2709
                                    "/ codeView cursorToCharacterPosition:newCursorPosition.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2710
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2711
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2712
                            newCursorPosition notNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2713
                                codeView cursorToCharacterPosition:newCursorPosition-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2714
                                codeView cursorRight.  "/ avoid going to the next line !!
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2715
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2716
                            codeView dontReplaceSelectionOnInput.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2717
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2718
                            checkForArgumentTemplates ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2719
                                "/ add opening brackets, etc.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2720
                                self insertAdditonalStuffAfterSelector:chosen.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2721
                            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2722
                            parenthesisToInsert notNil ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2723
                                |sav pos|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2724
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2725
                                sav := codeView characterPositionOfCursor-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2726
                                "/ check if already parenthized
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2727
                                parentNodeToParenthesize hasParentheses ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2728
                                    pos := parentNodeToParenthesize parentheses first first.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2729
                                    codeView selectFromCharacterPosition:pos to:pos.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2730
                                    codeView replaceSelectionBy:(parenthesisToInsert copyFirst:1) asString.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2731
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2732
                                    pos := parentNodeToParenthesize parentheses first last.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2733
                                    codeView selectFromCharacterPosition:pos to:pos.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2734
                                    codeView replaceSelectionBy:(parenthesisToInsert copyLast:1) asString.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2735
                                    codeView cursorToCharacterPosition:sav; cursorRight
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2736
                                ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2737
                                    codeView insertString:(parenthesisToInsert copyLast:1) atCharacterPosition:node receiver stop+1.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2738
                                    codeView insertString:(parenthesisToInsert copyFirst:1) atCharacterPosition:parentNodeToParenthesize start.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2739
                                    codeView cursorToCharacterPosition:sav+2; cursorRight
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2740
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2741
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2742
                        ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2743
                    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2744
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2745
                codeView
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2746
                    undoableDo:action
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2747
                    info:'Completion'.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2748
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2749
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2750
    actionBlock value:allBest value:editAction value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2751
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2752
    "Created: / 10-11-2006 / 13:18:27 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2753
    "Modified: / 16-02-2010 / 10:33:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2754
    "Modified: / 30-09-2017 / 14:12:47 / cg"
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  2755
    "Modified: / 01-03-2019 / 14:52:35 / Claus Gittinger"
6036
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  2756
    "Modified (comment): / 18-03-2019 / 11:22:48 / Claus Gittinger"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2757
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2758
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2759
codeCompletionForMessageTo:node into:actionBlock
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2760
    "find good suggestions for a message send to node, with no input yet.
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2761
     I.e. right after a receiver (w.o. any input yet)"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2762
    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2763
    |knownClass suggestions selectorsImplementedInClass mostUseful editActions pos|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2764
 
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  2765
    (knownClass := self classOfNode:node) isEmptyOrNil ifTrue:[
5621
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  2766
        "/ self breakPoint:#cg.
5113
6a5ae22ee501 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5112
diff changeset
  2767
        "/ self classOfNode:node.
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2768
        ^ self
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2769
    ].
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2770
    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2771
    Verbose == true ifTrue:[ 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2772
        Transcript show:node; show:' -> '; showCR:knownClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2773
    ].    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2774
    selectorsImplementedInClass := Set new.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2775
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2776
    knownClass withAllSuperclassesDo:[:cls |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2777
        cls ~~ Object ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2778
            selectorsImplementedInClass addAll:cls selectors.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2779
        ]    
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2780
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2781
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2782
    knownClass isMeta ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2783
        selectorsImplementedInClass := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2784
            selectorsImplementedInClass reject:[:sel |
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2785
                |mthd cat|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2786
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2787
                mthd := knownClass lookupMethodFor:sel.
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2788
                mthd notNil 
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2789
                  and:[(cat := mthd category) notNil 
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2790
                  and:[(cat startsWith: 'documentation')]]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2791
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2792
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2793
        knownClass theNonMetaclass isAbstract ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2794
            mostUseful := selectorsImplementedInClass select:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2795
                            knownClass implements:sel
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2796
                          ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2797
        ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2798
            mostUseful := selectorsImplementedInClass select:[:sel |
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2799
                                |mthd cat|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2800
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2801
                                mthd := knownClass lookupMethodFor:sel.
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2802
                                mthd notNil 
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2803
                                  and:[(cat := mthd category) notNil 
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2804
                                  and:[cat startsWith: 'instance']]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2805
                          ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2806
        ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2807
    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2808
        mostUseful := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2809
            #(
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2810
                "/ blocks
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2811
                ifTrue: ifFalse: whileTrue: whileFalse: on:do: ensure: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2812
                whileTrue whileFalse loop
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2813
                "/ any
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2814
                isNil notNil isEmpty notEmpty 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2815
            ).
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2816
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2817
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2818
    mostUseful notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2819
        suggestions := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2820
            (selectorsImplementedInClass select:[:sel | mostUseful includes:sel]) asNewOrderedCollection sort
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2821
            ,
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2822
            (selectorsImplementedInClass reject:[:sel | mostUseful includes:sel]) asNewOrderedCollection sort.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2823
    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2824
        suggestions := selectorsImplementedInClass asNewOrderedCollection sort.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2825
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2826
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2827
    suggestions := suggestions reject:[:sel | sel first == $_].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2828
    self sortUsefulSelectorsIn:suggestions. "/cosmetics
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2829
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2830
    pos := codeView characterPositionOfCursor.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2831
    editActions := suggestions collect:[:word |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2832
                        self editActionToReplaceCodeFrom:pos to:pos-1 by:word.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2833
                   ].                
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2834
    actionBlock value:suggestions value:editActions value:nil.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2835
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2836
    "Created: / 01-05-2016 / 17:01:21 / cg"
5621
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  2837
    "Modified: / 10-10-2017 / 16:57:21 / cg"
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  2838
    "Modified: / 03-03-2019 / 22:41:42 / Claus Gittinger"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2839
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2840
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2841
codeCompletionForMethodSpec:node
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2842
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2843
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2844
    self
5312
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2845
        codeCompletionForMethodSpec:node
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2846
        into:[:suggestions :action :whatIsIt |
5312
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2847
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2848
            |chosen|
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2849
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2850
            chosen := self askUserForCompletion:whatIsIt for:codeView
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2851
                           at:node start from:suggestions.
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2852
            chosen notNil ifTrue:[
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2853
                action value:(suggestions indexOf:chosen)
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2854
            ].
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2855
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2856
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2857
"/    |crsrPos
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2858
"/     selectorSoFar matchingSelectors
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2859
"/     selectors distances best rest
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2860
"/     allExistingMethods nameBag namesByCount selectors1 selectors2|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2861
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2862
"/    crsrPos := codeView characterPositionOfCursor - 1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2863
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2864
"/    selectorSoFar := ''.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2865
"/    node selectorParts doWithIndex:[:partToken :argNr|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2866
"/        |part|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2867
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2868
"/        part := partToken value.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2869
"/        selectorSoFar := selectorSoFar , part.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2870
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2871
"/        (crsrPos >= partToken start
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2872
"/        and:[crsrPos <= partToken stop]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2873
"/            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2874
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2875
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2876
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2877
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2878
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2879
"/                                        md := eachClass theMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2880
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2881
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2882
"/                                    ].
5312
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2883
"/                "/ don't forget the stuff in the class-line
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2884
"/                Metaclass withAllSuperclassesDo:[:cls |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2885
"/                    matchingSelectors addAll:(cls methodDictionary keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2886
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2887
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2888
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2889
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2890
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2891
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2892
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2893
"/                                        md := eachClass theNonMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2894
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2895
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2896
"/                                    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2897
"/            ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2898
"/            selectors := matchingSelectors asOrderedCollection.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2899
"/
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2900
"/            "/ if there is only one, and user has already entered it, he might want to complete the argument-name
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2901
"/            (selectors size == 1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2902
"/            and:[selectors first = selectorSoFar]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2903
"/                selectorSoFar numArgs == 0 ifTrue:[ ^ self ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2904
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2905
"/                allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2906
"/                                        collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2907
"/                nameBag := Bag new.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2908
"/                allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2909
"/                namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2910
"/                "/ take the one which occurs most often
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2911
"/                best := self askUserForCompletion:'argument' for:codeView at: node start from:(namesByCount collect:[:a | a key]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2912
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2913
"/                codeView
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2914
"/                    undoableDo:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2915
"/                        (crsrPos+1) >= codeView contents size ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2916
"/                            codeView paste:best.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2917
"/                        ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2918
"/                            codeView insertString:best atCharacterPosition:crsrPos+1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2919
"/                        ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2920
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2921
"/                    info:'completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2922
"/                codeView cursorToCharacterPosition:(crsrPos + best size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2923
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2924
"/                "the ones implemented in superclasses are shown first"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2925
"/                classOrNil notNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2926
"/                    selectors1 := selectors select:[:sel | classOrNil respondsTo:sel].  "/ in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2927
"/                    selectors2 := selectors reject:[:sel | selectors1 includes:sel ].   "/ not in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2928
"/                ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2929
"/                    selectors1 := selectors
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2930
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2931
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2932
"/                distances := selectors1 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2933
"/                distances sortWith:selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2934
"/                selectors1 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2935
"/                selectors := selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2936
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2937
"/                selectors2 notEmptyOrNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2938
"/                    distances := selectors2 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2939
"/                    distances sortWith:selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2940
"/                    selectors2 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2941
"/                    selectors1 := selectors1 collect:[:sel | sel allBold].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2942
"/                    selectors := selectors1,selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2943
"/                ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2944
"/
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2945
"/                best := self askUserForCompletion:'selector' for:codeView at:(node start) from:selectors.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2946
"/                best isNil ifTrue:[^ self].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2947
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2948
"/                rest := best copyFrom:selectorSoFar size.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2949
"/                codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2950
"/                    undoableDo:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2951
"/                        codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2952
"/                            replaceFromCharacterPosition:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2953
"/                            to:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2954
"/                            with:rest
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2955
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2956
"/                    info:'Completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2957
"/                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2958
"/            ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2959
"/            codeView cursorRight. "/ kludge to make it visible
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2960
"/        ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2961
"/    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2962
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2963
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2964
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2965
    "Modified: / 16-02-2010 / 10:13:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2966
    "Modified: / 01-06-2012 / 20:31:36 / cg"
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  2967
    "Modified (format): / 30-09-2017 / 12:58:32 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2968
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2969
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2970
codeCompletionForMethodSpec:node into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2971
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2972
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2973
    |crsrPos crsrLine crsrCol
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2974
     selectorSoFar matchingSelectors
5146
1bc2c5c6fc91 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 5143
diff changeset
  2975
     selectors allExistingMethods nameBag namesByCount 
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2976
     allSelectors
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2977
     selectorsForIsXXXTests selectorsSentInClass selectorsImplementedInSuper 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2978
     editAction editActionForArg argNames selectorsForVars
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  2979
     selectorTypedSoFar selectorTypedSoFarLC addIfNotYetImplemented alreadyOK processMenu|
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2980
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2981
    allSelectors := Set new.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2982
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2983
    "/ Transcript showCR:'m'.
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2984
    crsrLine := codeView cursorLine.
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2985
    crsrCol := codeView cursorCol.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2986
    crsrPos := codeView characterPositionOfCursor - 1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2987
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2988
    selectorTypedSoFar := node selector.
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  2989
    selectorTypedSoFarLC := selectorTypedSoFar asLowercase.
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  2990
    
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2991
    selectorTypedSoFar isUnarySelector ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2992
        "/ user has just begun to edit a selector.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2993
        "/ often, a good completion are the names of instVars for which no corresponding getter/setter exists
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2994
        classOrNil notNil ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2995
            selectorsForVars := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2996
            selectorsImplementedInSuper := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2997
            selectorsSentInClass := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2998
            selectorsForIsXXXTests := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2999
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3000
            addIfNotYetImplemented :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3001
                [:list :sel |
5738
59d8e9757a0f #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5714
diff changeset
  3002
                    "/ sel = 'max:' ifTrue:[self breakPoint:#cg].
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3003
                    (sel sameAs: selectorTypedSoFar) ifFalse:[    
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3004
                        (allSelectors includes:sel) ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3005
                            (classOrNil implements:sel asSymbol) ifFalse:[ 
5598
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3006
                                list add:sel.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3007
                                allSelectors add:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3008
                            ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3009
                        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3010
                    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3011
                ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3012
                
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3013
            classOrNil instVarNames do:[:nm |
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3014
                (nm startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3015
                    addIfNotYetImplemented value:selectorsForVars value:nm.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3016
                    addIfNotYetImplemented value:selectorsForVars value:(nm,':').
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3017
                 ]
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3018
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3019
            classOrNil isMeta ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3020
                classOrNil theNonMetaclass classVarNames do:[:nm |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3021
                    |nmSel|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3022
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3023
                    nmSel := nm asLowercaseFirst.
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3024
                    (nmSel startsWith:selectorTypedSoFarLC) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3025
                        addIfNotYetImplemented value:selectorsForVars value:nmSel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3026
                        addIfNotYetImplemented value:selectorsForVars value:(nmSel,':').
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3027
                    ]
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3028
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3029
            ] ifFalse:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3030
                "/ isXXX ?
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3031
                (('is',classOrNil nameWithoutPrefix) startsWith:selectorTypedSoFar ) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3032
                    addIfNotYetImplemented value:selectorsForIsXXXTests value:('is',classOrNil nameWithoutPrefix).
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3033
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3034
            ].
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3035
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3036
            "/ and also messages sent by the class itself
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3037
            classOrNil methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3038
                m messagesSentToSelf do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3039
                    (sel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3040
                        addIfNotYetImplemented value:selectorsSentInClass value:sel.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3041
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3042
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3043
            ].
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3044
            classOrNil isMeta ifFalse:[
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3045
                classOrNil theMetaclass methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3046
                    m messagesSent do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3047
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3048
                            addIfNotYetImplemented value:selectorsSentInClass value:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3049
                        ]                     
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3050
                    ]                     
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3051
                ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3052
            ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3053
            "/ and also messages implemented by superclasses (except Object)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3054
            classOrNil allSuperclassesDo:[:eachSuperclass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3055
                eachSuperclass ~~ Object ifTrue:[
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  3056
                    eachSuperclass selectorsDo:[:sel |
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3057
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3058
                            addIfNotYetImplemented value:selectorsImplementedInSuper value:sel.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3059
                        ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3060
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3061
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3062
            ].
5598
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3063
            "/ if on the instance side, and the class side has menu- or windowspecs,
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3064
            "/ also add messages named as callbacks or aspects
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3065
            (classOrNil theNonMetaclass inheritsFrom:ApplicationModel) ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3066
                processMenu :=  
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3067
                    [:menu |
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3068
                        menu itemsDo:[:item |
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3069
                            |sel subMenu|
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3070
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3071
                            (sel := item choice) notNil ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3072
                                addIfNotYetImplemented value:selectorsSentInClass value:sel
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3073
                            ].    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3074
                            (sel := item itemValue) notNil ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3075
                                addIfNotYetImplemented value:selectorsSentInClass value:sel
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3076
                            ].    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3077
                            (sel := item submenuChannel) notNil ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3078
                                addIfNotYetImplemented value:selectorsSentInClass value:sel
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3079
                            ].    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3080
                            (subMenu := item submenu) notNil ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3081
                                processMenu value:subMenu
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3082
                            ].    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3083
                        ].    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3084
                    ].    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3085
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3086
                classOrNil withAllSuperclassesDo:[:eachSuperclass |
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3087
                    eachSuperclass theMetaclass methodDictionary keysAndValuesDo:[:sel :mthd |
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3088
                        |spec bodyNode retVal specArray menu| 
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3089
                        
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3090
                        (mthd hasMenuResource) ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3091
                            bodyNode := mthd parseTree body.
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3092
                            bodyNode lastIsReturn ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3093
                                (retVal := bodyNode statements last value) isLiteralArray ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3094
                                    specArray := retVal value.
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3095
                                    menu := specArray decodeAsLiteralArray.
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3096
                                    processMenu value:menu.    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3097
                                ].
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3098
                            ].
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3099
                        ].    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3100
                        (mthd hasCanvasResource) ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3101
                            bodyNode := mthd parseTree body.
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3102
                            bodyNode lastIsReturn ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3103
                                (retVal := bodyNode statements last value) isLiteralArray ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3104
                                    specArray := retVal value.
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3105
                                    spec := specArray decodeAsLiteralArray.
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3106
                                    spec aspectSelectors do:[:sel | addIfNotYetImplemented value:selectorsSentInClass value:sel].
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3107
                                    spec valueSelectors do:[:sel | addIfNotYetImplemented value:selectorsSentInClass value:sel].
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3108
                                    spec actionSelectors do:[:sel | addIfNotYetImplemented value:selectorsSentInClass value:sel].
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3109
                                ].
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3110
                            ].
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3111
                        ].
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3112
                    ].    
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3113
                    eachSuperclass selectorsDo:[:sel |
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3114
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3115
                            addIfNotYetImplemented value:selectorsImplementedInSuper value:sel.
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3116
                        ]                     
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3117
                    ]                     
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3118
                ]
5b69ed53ef4b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
  3119
            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3120
        ].
4371
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  3121
    ].
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  3122
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3123
    selectorSoFar := ''.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3124
    matchingSelectors := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3125
    
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3126
    node selectorParts doWithIndex:[:partToken :argNr|
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3127
        |part|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3128
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3129
        part := partToken value.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3130
        selectorSoFar := selectorSoFar , part.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3131
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3132
        (crsrPos >= partToken start 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3133
            and:[crsrPos <= partToken stop
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3134
                 or:[ (crsrPos == (partToken stop+1))
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3135
                      and:[codeView characterBeforeCursor == Character space]] ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3136
        ) ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3137
            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3138
                Smalltalk 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3139
                    allClassesDo:[:eachClass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3140
                        |md|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3141
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3142
                        md := eachClass theMetaclass methodDictionary.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3143
                        matchingSelectors addAll:(md keys 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3144
                                                    select:[:sel |sel startsWith:selectorSoFar]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3145
                    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3146
                "/ do not forget the stuff in the class-line
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3147
                Metaclass withAllSuperclassesDo:[:cls |
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3148
                    matchingSelectors addAll:(cls methodDictionary keys 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3149
                                                select:[:sel |sel startsWith:selectorSoFar]).
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3150
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3151
            ] ifFalse:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3152
                Smalltalk 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3153
                    allClassesDo:[:eachClass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3154
                        |md|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3155
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3156
                        md := eachClass theNonMetaclass methodDictionary.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3157
                        matchingSelectors addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3158
                    ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3159
            ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3160
        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3161
    ].  
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3162
    alreadyOK := matchingSelectors includes:selectorTypedSoFar.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3163
    matchingSelectors remove:selectorTypedSoFar ifAbsent:[].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3164
    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3165
    selectors := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3166
            
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3167
    selectorsForVars notNil ifTrue:[ 
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3168
        selectors addAll:selectorsForVars 
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3169
    ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3170
    selectorsSentInClass notNil ifTrue:[ selectors addAll:selectorsSentInClass ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3171
    selectorsImplementedInSuper notNil ifTrue:[ selectors addAll:selectorsImplementedInSuper ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3172
    selectorsForIsXXXTests notNil ifTrue:[ selectors addAll:selectorsForIsXXXTests ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3173
        
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3174
    (selectors count:[:sel | sel asLowercase startsWith:selectorTypedSoFarLC]) == 0 ifTrue:[
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3175
        selectors addAll:matchingSelectors.
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3176
    ].    
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3177
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3178
    selectors := selectors asOrderedCollection.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3179
    selectors sort:[:a :b | a size < b size].
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3180
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3181
    selectorsSentInClass notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3182
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3183
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3184
                        by:[:sel | selectorsSentInClass includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3185
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3186
    selectorsImplementedInSuper notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3187
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3188
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3189
                        by:[:sel | selectorsImplementedInSuper includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3190
    ].
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3191
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3192
    selectors := self 
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3193
                    splitSelectorList:selectors 
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3194
                    by:[:sel | sel asLowercase startsWith:selectorTypedSoFarLC].
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3195
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3196
    selectorsForVars notEmptyOrNil ifTrue:[
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3197
        selectors := self 
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3198
                        splitSelectorList:selectors 
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3199
                        by:[:sel | selectorsForVars includes:sel].
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3200
    ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3201
    selectorsForIsXXXTests notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3202
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3203
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3204
                        by:[:sel | selectorsForIsXXXTests includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3205
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3206
    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3207
    selectors size > 100 ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3208
        selectors := selectors copyTo:100.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3209
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3210
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3211
    "/ if there is only one, and user has already entered it, 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3212
    "/ he might want to complete the argument-name
6138
1dd5dc49a996 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 6134
diff changeset
  3213
    (alreadyOK and:[selectorSoFar argumentCount > 0]) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3214
        allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3215
                                    collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3216
        nameBag := Bag new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3217
        allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
6082
96c1001f95ef #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 6036
diff changeset
  3218
        namesByCount := nameBag valuesAndCounts copy sort:[:a :b | a value < b value].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3219
        namesByCount := namesByCount copyToMax:5.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3220
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3221
        "/ take the one which occurs most often
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3222
        argNames := (namesByCount collect:[:a | a key]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3223
        argNames do:[:eachArgName |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3224
            selectors add:('%1 %2 %3' 
5089
9592bdeeff69 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5086
diff changeset
  3225
                            bindWith:(selectorSoFar withColor:Color darkGrey) 
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3226
                            with:eachArgName
5089
9592bdeeff69 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5086
diff changeset
  3227
                            with:('(argument)' allItalic withColor:Color darkGrey)).
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3228
        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3229
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3230
        editActionForArg :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3231
                [:chosenItem |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3232
                    |chosenName|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3233
                    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3234
                    chosenName := chosenItem 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3235
                                    copyFrom:(selectorSoFar size+2)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3236
                                    to:(chosenItem indexOfSeparatorStartingAt:selectorSoFar size+2)-1.
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3237
                    codeView
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3238
                        undoableDo:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3239
                            (crsrPos+1) >= codeView contents size ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3240
                                codeView paste:chosenName.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3241
                                codeView cursorToCharacterPosition:(crsrPos + chosenName size - 1).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3242
                            ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3243
                                codeView cursorToCharacterPosition:crsrPos.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3244
                                codeView cursorRight.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3245
                                codeView insertStringAtCursor:chosenName.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3246
                                codeView selectFromCharacterPosition:crsrPos+1 to:crsrPos+1+chosenName size-1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3247
                                codeView dontReplaceSelectionOnInput
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3248
                            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3249
                        ]
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3250
                        info:'argname completion'.
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3251
                ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3252
    ].            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3253
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3254
    "/ no, still more possibilities for the selector.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3255
    "/ the ones implemented in superclasses are shown first.
5146
1bc2c5c6fc91 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 5143
diff changeset
  3256
    (classOrNil notNil and:[classOrNil superclass notNil]) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3257
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3258
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3259
                        by:[:sel | classOrNil superclass implements:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3260
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3261
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3262
"/"/    distances := selectors collect:[:each | each spellAgainst:selectorSoFar].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3263
"/"/    distances sortWith:selectors.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3264
"/"/    selectors reverse.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3265
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3266
    editAction :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3267
        [:selectedCompletionIndex |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3268
            |chosen rest|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3269
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3270
            chosen := selectors at:selectedCompletionIndex.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3271
            (editActionForArg notNil and:[ chosen includesSeparator ]) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3272
                editActionForArg value:chosen.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3273
            ] ifFalse:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3274
                rest := chosen copyFrom:selectorSoFar size + 1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3275
                codeView
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3276
                    undoableDo:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3277
                        codeView insertString:rest atLine:crsrLine col:crsrCol.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3278
                    ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3279
                    info:'Completion'.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3280
                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3281
                codeView cursorRight. "/ kludge to make it visible
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3282
            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3283
        ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3284
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3285
    actionBlock
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3286
        value:selectors
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3287
        value:editAction
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3288
        value:'selector'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3289
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3290
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3291
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3292
    "Modified: / 16-02-2010 / 10:13:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5637
c37992ea83d4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5633
diff changeset
  3293
    "Modified: / 19-11-2017 / 14:47:34 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3294
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3295
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3296
codeCompletionForTempVariable:node into:actionBlock
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3297
!
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3298
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3299
codeCompletionForVariable:node into:actionBlock
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3300
    |nonMetaClass crsrPos nm parent
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3301
     allVariables allDistances variablesAlreadyAdded nodeVal
5081
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3302
     char getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3303
     globalFactor localFactor selectorOfMessageToNode implementors argIdx namesUsed kwPart editActions suggestions nameIsOK longerNames setOfNames otherArgNames
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3304
     suggestionsWithInfo isLeftSideOfAssignment|
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3305
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  3306
    "/ Transcript show:'var in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3307
    classOrNil notNil ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3308
        nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3309
    ].
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3310
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3311
    nm := node name.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3312
    parent := node parent.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3313
    isLeftSideOfAssignment := false.
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3314
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3315
    (parent notNil) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3316
        (parent isMessage) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3317
            node == parent receiver ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3318
                selectorOfMessageToNode := parent selector
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3319
            ]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3320
        ] ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3321
            (parent isAssignment) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3322
                isLeftSideOfAssignment := (node == node parent variable).
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3323
            ].
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3324
        ].
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3325
    ].
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3326
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3327
    crsrPos := codeView characterPositionOfCursor.
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3328
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3329
    "/ if we are behind the variable and a space has already been entered,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3330
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3331
    "/ If the variable represents a global, present its instance creation messages
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3332
    char := codeView characterBeforeCursor.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3333
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3334
    (isLeftSideOfAssignment not and:[char == Character space]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3335
        nm knownAsSymbol ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3336
            classOrNil isNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3337
                nodeVal := Smalltalk at:nm asSymbol.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3338
            ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3339
                nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3340
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3341
            nodeVal isBehavior ifTrue:[
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3342
                |selectors selectors1 selectors2|
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3343
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3344
                selectors1 := OrderedSet new.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3345
                selectors2 := OrderedSet new.
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3346
                nodeVal class
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3347
                    withAllSuperclassesDo:[:cls |
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3348
                        cls methodDictionary keysAndValuesDo:[:sel :mthd |
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3349
                            |cat|
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  3350
                            cat := mthd category.
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  3351
                            (cat notNil and:[cat sameAs: 'instance creation']) ifTrue:[
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3352
                                selectors1 add:sel
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3353
                            ] ifFalse:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3354
                                "/ other category: look if it sends new, new: etc.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3355
                                (mthd messagesSent includesAny:#(new new: basicNew basicNew:)) ifTrue:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3356
                                    selectors2 add:sel
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3357
                                ].
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3358
                            ]
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3359
                        ]
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3360
                    ].
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3361
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3362
                selectors := selectors1 order sort , #('-') , selectors2 order sort.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3363
                editActions := selectors collect:[:word | self editActionToInsert:word].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3364
                actionBlock value:selectors value:editActions value:nil.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3365
"/                editAction :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3366
"/                    [:answer |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3367
"/                        |s|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3368
"/                        s := answer isInteger ifTrue:[selectors at:answer] ifFalse:[answer].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3369
"/                        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3370
"/                            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3371
"/                                codeView insertString:s atCharacterPosition:crsrPos.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3372
"/                                codeView cursorToCharacterPosition:crsrPos+s size.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3373
"/                            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3374
"/                            info:'completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3375
"/                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3376
"/                actionBlock value:selectors value:editAction value:nil.
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3377
                ^ self.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3378
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3379
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3380
    ].
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3381
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3382
    "/ this is pure voodoo magic (tries to make a good spelling weight,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3383
    "/ by weighting the number of startsWith characters into the spelling distance...)
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3384
    getDistanceComputeBlockWithWeight :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3385
        [:weight |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3386
            [:each |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3387
                |dist factor|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3388
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3389
                dist := each spellAgainst:nm.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3390
                factor := 1.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3391
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3392
                "/ bump the weight-factor if the name string is included
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3393
                (each includesString:nm) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3394
                    (each startsWith:nm) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3395
                        factor := 6 * weight * nm size.
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3396
                    ] ifFalse:[
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3397
                        (each endsWith:nm) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3398
                            factor := 5 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3399
                        ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3400
                            nm size > 1 ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3401
                                factor := 4 * weight * nm size
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3402
                            ].
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3403
                        ].
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3404
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3405
                ] ifFalse:[
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3406
                    (each includesString:nm caseSensitive:false) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3407
                        (each asLowercase startsWith:nm asLowercase) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3408
                            factor := 4 * weight * nm size.
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3409
                        ] ifFalse:[
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3410
                            (each asLowercase endsWith:nm asLowercase) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3411
                                factor := 3 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3412
                            ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3413
                                nm size > 1 ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3414
                                    factor := 2 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3415
                                ]
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3416
                            ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3417
                        ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3418
                    ]
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3419
                ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3420
                dist := dist + (weight*factor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3421
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3422
                each -> (dist * weight)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3423
             ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3424
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3425
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3426
    nameIsOK := false.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3427
    addWithFactorBlock :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3428
        [:eachNames :factor |
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3429
            |distanceComputeBlock|
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3430
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3431
            distanceComputeBlock := (getDistanceComputeBlockWithWeight value:factor).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3432
            eachNames do:[:nameToAdd |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3433
                (nameToAdd = nm) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3434
                    nameIsOK := true
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3435
                ] ifFalse:[ "/ not again
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3436
                    (variablesAlreadyAdded includes:nameToAdd) ifFalse:[  "/ not again
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3437
                        variablesAlreadyAdded add:nameToAdd.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3438
                        allVariables add:nameToAdd.
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3439
                        allDistances add:(distanceComputeBlock value:nameToAdd).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3440
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3441
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3442
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3443
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3444
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3445
    nm isUppercaseFirst ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3446
        globalFactor := 2.    "/ favour globals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3447
        localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3448
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3449
        globalFactor := 1.    "/ favour locals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3450
        localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3451
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3452
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3453
    variablesAlreadyAdded := Set new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3454
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3455
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3456
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3457
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3458
    (parent notNil
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3459
    and:[parent isMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3460
    and:[parent arguments includes:node]]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3461
        "/ yes -
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3462
        "/ now that's cool: look how the name of this argument is in other implementations
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3463
        "/ of this method, and take that as a basis of the selection
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3464
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3465
        implementors := SystemBrowser
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3466
                            findImplementorsOf:(parent selector)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3467
                            in:(Smalltalk allClasses)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3468
                            ignoreCase:false.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3469
        "/ which argument is it
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3470
        argIdx := parent arguments indexOf:node.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3471
        implementors size > 50 ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3472
            implementors := implementors asOrderedCollection copyTo:50.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3473
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3474
        namesUsed := implementors
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3475
                        collect:[:eachImplementor |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3476
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3477
                            parseTree := eachImplementor parseTree.
5539
04879fedd753 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5528
diff changeset
  3478
                            (parseTree notNil and:[parseTree arguments size >= argIdx])
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3479
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3480
                                ifTrue:[ (parseTree arguments at:argIdx) name] ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3481
                        thenSelect:[:a | a notNil].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3482
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3483
        addWithFactorBlock value:namesUsed value:(2 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3484
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3485
        "/ try some commonly used arg names, such as aBoolean, anInteger, etc.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3486
        nm size > 1 ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3487
            |tryClassNamesWith|
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3488
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3489
            ((nm startsWith:'a') and:[(nm at:2) isUppercase]) ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3490
                tryClassNamesWith := 'a'
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3491
            ] ifFalse:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3492
                (nm size > 2 and:[ (nm startsWith:'an') and:[(nm at:3) isUppercase]]) ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3493
                    tryClassNamesWith := 'an'.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3494
                ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3495
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3496
            tryClassNamesWith notNil ifTrue:[
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3497
                addWithFactorBlock
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3498
                    value:(Smalltalk keys
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3499
                            collect:[:className | tryClassNamesWith,className]
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3500
                            thenSelect:[:name | name startsWith:nm])
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3501
                    value:(1.5 * localFactor)
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3502
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3503
        ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3504
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3505
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3506
            "/ also, look for the keyword before the argument,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3507
            "/ and see if there is such an instVar
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3508
            "/ if so, add it with -Arg
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3509
            parent selector isKeyword ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3510
                kwPart := parent selector keywords at:argIdx.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3511
                (classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3512
                    addWithFactorBlock
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3513
                        value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3514
                        value:(1 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3515
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3516
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3517
            "/ look for the variable names of any other method in that class
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3518
            otherArgNames := Set new.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3519
            classOrNil methodDictionary keysAndValuesDo:[:sel :mthd |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3520
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3521
                            parseTree := mthd parseTree.
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  3522
                            (parseTree notNil and:[parseTree arguments size ~~ 0])
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3523
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3524
                                ifTrue:[ otherArgNames addAll:(parseTree arguments collect:[:each | each name])] ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3525
            addWithFactorBlock value:otherArgNames value:(1.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3526
        ].
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3527
        addWithFactorBlock
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3528
            value:(codeView previousReplacements
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3529
                                    collect:[:p | p value asString]
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3530
                                    thenSelect:[:s | s isValidSmalltalkIdentifier])
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3531
            value:(1.3 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3532
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3533
        "/ locals in the block/method
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3534
        |names nameSpace|
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3535
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3536
        names := OrderedCollection withAll:node allVariablesOnScope.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3537
        setOfNames := Set withAll:names.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3538
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3539
        rememberedScopeNodes notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3540
            "/ notNil when a parseError occurred.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3541
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3542
                (eachScope isMethod or:[eachScope isBlock]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3543
                    eachScope argumentNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3544
                        (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3545
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3546
                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3547
                    eachScope isSequence ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3548
                        eachScope temporaryNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3549
                            (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3550
                        ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3551
                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3552
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3553
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3554
                "/ (setOfNames includesAll:(eachScope allDefinedVariables)) ifFalse:[ self halt].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3555
            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3556
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3557
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3558
                eachScope variableNodesDo:[:var |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3559
                    (setOfNames includes:var name) ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3560
                        names add:var name. setOfNames add:var name
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3561
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3562
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3563
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3564
        ] ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3565
            "/ tree must be there; in order to get as-yet-undeclared method locals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3566
            "/ (further down the code), add them also
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3567
            tree variableNodesDo:[:var |
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3568
                |name|
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3569
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3570
                name := var name.
5552
2fe0fa28ecf5 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5551
diff changeset
  3571
                (name isLowercaseFirst or:[isLeftSideOfAssignment not]) ifTrue:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3572
                    (setOfNames includes:name) ifFalse:[
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3573
                        names add:name.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3574
                        setOfNames add:name
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3575
                    ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3576
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3577
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3578
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3579
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3580
        addWithFactorBlock value:names value:(4 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3581
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3582
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3583
            "/ instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3584
            addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3585
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3586
            "/ inherited instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3587
            classOrNil superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3588
                addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3589
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3590
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3591
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3592
        "/ magic:
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3593
        "/ if the node to be expanded is the receiver in a message, look for the selector sent to it
5771
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3594
        "/ retrieve names which respond to those messages a higher weight
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3595
        selectorOfMessageToNode notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3596
            |responders nonResponders|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3597
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3598
            "/ responding to that message
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3599
            classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3600
                "/ private classes
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3601
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3602
                                   value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3603
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3604
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3605
                names := nonMetaClass classVarNames.
5771
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3606
                responders := OrderedCollection new.
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3607
                nonResponders := OrderedCollection new.
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3608
                names do:[:classVar |
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3609
                    |varValue|
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3610
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3611
                    varValue := nonMetaClass classVarAt:classVar.
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3612
                    ((varValue isBridgeProxy not 
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3613
                    and:[ varValue respondsTo:selectorOfMessageToNode])
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3614
                        ifTrue:[responders]
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3615
                        ifFalse:[nonResponders]) add:classVar
efe639d65c0e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5738
diff changeset
  3616
                ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3617
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3618
                addWithFactorBlock value:responders value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3619
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3620
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3621
                "/ superclass var names
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3622
                nonMetaClass allSuperclassesDo:[:superClass |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3623
                    names := superClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3624
                    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3625
                    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3626
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3627
                    addWithFactorBlock value:responders value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3628
                    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3629
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3630
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3631
                isLeftSideOfAssignment ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3632
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3633
                    classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3634
                        names := classOrNil topNameSpace keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3635
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3636
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3637
                        responders := names select:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3638
                        nonResponders := names reject:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3639
                        addWithFactorBlock value:responders value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3640
                        addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3641
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3642
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3643
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3644
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3645
            isLeftSideOfAssignment ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3646
                "/ globals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3647
                names := Smalltalk keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3648
                names := names reject:
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3649
                                [:nm |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3650
                                    (nm includes:$:) and:[ (Smalltalk at:nm) isBehavior not]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3651
                                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3652
                names := names reject:[:nm | nm startsWith:'Undeclared:::' ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3653
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3654
                names := names select:[:nm | nm isUppercaseFirst ] as:OrderedCollection.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3655
                responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3656
                nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3657
                addWithFactorBlock value:responders value:(1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3658
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3659
            ].
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3660
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3661
            isLeftSideOfAssignment ifFalse:[ "/ no, we will not suggest assigning to pool vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3662
                classOrNil notNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3663
                    "/ pool variables
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3664
                    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3665
                        |pool names|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3666
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3667
                        pool := Smalltalk at:poolName.
5224
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3668
                        pool notNil ifTrue:[
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3669
                            names := pool classVarNames.
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3670
                            names := names select:[:nm | nm isUppercaseFirst ].
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3671
                            responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3672
                            nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3673
                            addWithFactorBlock value:responders value:(2.5 * globalFactor).
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3674
                            addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3675
                        ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3676
                    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3677
                ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3678
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3679
        ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3680
            classOrNil notNil ifTrue:[
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3681
                isLeftSideOfAssignment ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3682
                    "/ private classes
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3683
                    addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3684
                                       value:(2.75 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3685
                ].
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3686
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3687
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3688
                addWithFactorBlock value:nonMetaClass classVarNames value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3689
                nonMetaClass superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3690
                    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3691
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3692
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3693
                isLeftSideOfAssignment ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3694
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3695
                    classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3696
                        names := classOrNil topNameSpace keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3697
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3698
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3699
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3700
                    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3701
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3702
                    ((nameSpace := classOrNil nameSpace) notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3703
                        names := nameSpace isNameSpace ifTrue:[nameSpace keys] ifFalse:[nameSpace privateClasses collect:[:c | c nameWithoutPrefix]].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3704
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3705
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3706
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3707
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3708
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3709
                isLeftSideOfAssignment ifFalse:[ "/ no, we will not suggest assigning to pool vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3710
                    "/ pool variables
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3711
                    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3712
                        |pool names|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3713
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3714
                        pool := Smalltalk at:poolName.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3715
                        pool isNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3716
                            Transcript showCR:'non existent pool: ',poolName
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3717
                        ] ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3718
                            names := pool classVarNames.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3719
                            addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3720
                        ]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3721
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3722
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3723
            ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3724
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3725
            isLeftSideOfAssignment ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3726
                "/ globals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3727
                names := OrderedCollection new.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3728
                Smalltalk keysDo:[:k |
5784
6d086db72816 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
  3729
                    |val|
6d086db72816 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
  3730
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3731
                    (k isUppercaseFirst
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3732
                    and:[ (k startsWith:'Undeclared:::') not
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3733
                    and:[ ((k includes:$:) and:[ (k includesString:'::') not]) not ]]) ifTrue:[
5784
6d086db72816 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
  3734
                        "/ ignore obsolete classes
6d086db72816 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
  3735
                        val := Smalltalk classNamed:k.
6d086db72816 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
  3736
                        (val isBehavior and:[val isObsolete]) ifFalse:[
6d086db72816 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
  3737
                            names add:k
6d086db72816 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
  3738
                        ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3739
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3740
                ].
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3741
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3742
                "/ only consider all globals, if the first char of the completed name is uppercase;
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3743
                "/ otherwise, only consider names with a caseInsensitve prefix match
5552
2fe0fa28ecf5 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5551
diff changeset
  3744
                nm isUppercaseFirst ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3745
                    names := names select:[:globalName | globalName asLowercase startsWith: nm].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3746
                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3747
                addWithFactorBlock value:names value:(1.5 * globalFactor).
4665
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3748
            ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3749
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3750
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3751
        isLeftSideOfAssignment ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3752
            "/ pseudos - assuming that thisContext is seldom used.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3753
            "/ also assuming, that nil is short so its usually typed in.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3754
            addWithFactorBlock value:#('self') value:(2.5 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3755
            addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3756
            addWithFactorBlock value:#('super' 'false' 'true') value:(2 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3757
            addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3758
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3759
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3760
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3761
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3762
4410
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3763
"/ nope (foo := foo + 1) should be possible!!
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3764
"/    (parent notNil and:[parent isAssignment]) ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3765
"/        "/ remove the left side of the assignment (to avoid foo := foo suggestions)
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3766
"/        |i|
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3767
"/
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3768
"/        i := allDistances findFirst:[:entry | entry key = parent variable name].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3769
"/        i ~~ 0 ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3770
"/            allDistances removeAtIndex:i
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3771
"/        ].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3772
"/    ].
4385
d3381caeb327 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4382
diff changeset
  3773
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3774
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3775
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3776
                                                           ifTrue:[el]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3777
                                                           ifFalse:[best]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3778
                                                    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3779
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3780
    allDistances sort:[:a :b |
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3781
                                a value > b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3782
                                    true
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3783
                                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3784
                                    a value = b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3785
                                        a key < b key
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3786
                                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3787
                                        false
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3788
                                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3789
                                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3790
                      ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3791
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3792
    allTheBest := allDistances.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3793
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3794
    nameIsOK ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3795
        "/ if the name already exists, only allow longer names, if there are
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3796
        longerNames := allTheBest select:[:assoc | (assoc key startsWith:nm) or:[assoc key endsWith:nm]].
5033
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3797
        longerNames size < 30 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3798
            longerNames := allTheBest select:[:assoc | assoc key includesString:nm caseSensitive:false].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3799
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3800
        longerNames isEmpty ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3801
            "/ no better name
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3802
            ^ self
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3803
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3804
        allTheBest := longerNames.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3805
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3806
5033
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3807
    allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3808
        allTheBest := allTheBest copyTo:20.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3809
"/        "/ remove all those which are below some threshold or are a prefix
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3810
"/        0.2 to:0.9 by:0.1 do:[:delta |
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3811
"/            |bestValue n|
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3812
"/
5033
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3813
"/            "/ if still too many, remove more and more
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3814
"/            allTheBest size > 50 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3815
"/                bestValue := bestAssoc value * delta.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3816
"/                n := allTheBest select:[:entry | (entry key startsWith:nm) or:[ entry value >= bestValue ]].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3817
"/                n size >= 15 ifTrue:[ allTheBest := n ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3818
"/            ]
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3819
"/        ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3820
"/        allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3821
"/            "/ remove all those which are below some threshold
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3822
"/            0.2 to:0.9 by:0.1 do:[:delta |
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3823
"/                |bestValue n|
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3824
"/                "/ if still too many, remove more and more
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3825
"/                allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3826
"/                    bestValue := bestAssoc value * delta.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3827
"/                    allTheBest := allTheBest select:[:entry | entry value >= bestValue ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3828
"/                ]
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3829
"/            ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3830
"/        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3831
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3832
    suggestions := allTheBest collect:[:assoc | assoc key].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3833
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3834
    "/ finally, the trick is to bring them into a reasonable order...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3835
    "/ sort the prefix matchers by length, the others by spelling distance
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3836
    "/ and bring the prefix-matchers towards the beginning
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3837
    suggestions := ((suggestions select:[:s | s startsWith:nm]) sort:[:a :b | a size < b size ])
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3838
                   ,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3839
                   (suggestions reject:[:s | s startsWith:nm]).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3840
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3841
    "/ if super is among them, add a full call to the completions
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3842
    (suggestions includes:'super') ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3843
        (tree notNil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3844
        and:[ tree isMethod ]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3845
            Error handle:[:ex |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3846
                Transcript showCR:'parse error in code completion ignored'.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3847
            ] do:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3848
                suggestions addFirst:('super ',(Parser methodSpecificationForSelector:tree selector argNames:(tree argumentNames)),'.').
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3849
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3850
        ].
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3851
    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3852
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3853
    suggestionsWithInfo :=
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3854
        suggestions
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3855
            collect:[:eachName |
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3856
                |val kind valAndKind printString info|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3857
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3858
                valAndKind := self valueAndKindOfVariable:eachName.
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3859
                valAndKind notNil ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3860
                    val := valAndKind first.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3861
                    kind := valAndKind second.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3862
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3863
                    val isBehavior ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3864
                        val isLoaded ifFalse:[
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3865
                            info := 'autoloaded class in %1' bindWith:(val category ? 'unknown category').
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3866
                        ] ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3867
                            val isNameSpace ifTrue:[
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3868
                                info := 'namespace'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3869
                            ] ifFalse:[
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3870
                                info := 'class in %1' bindWith:(val category ? 'unknown category')
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3871
                            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3872
                        ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3873
                    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3874
                        "/ Parser findBest:30 selectorsFor:'isLite' in:nil forCompletion:true
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3875
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3876
                        (val isLiteral and:[ (printString := val printString) size < 15 ]) ifTrue:[
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3877
                            info := printString,', a ', kind
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3878
                        ] ifFalse:[
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3879
                            info := val class nameWithArticle,', a ',kind
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3880
                        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3881
                    ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3882
                ].
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3883
                info notNil ifTrue:[
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3884
                    eachName,(' (',(' ',info,' ') allItalic,')') allGray
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3885
                ] ifFalse:[
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3886
                    eachName
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  3887
                ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3888
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3889
5081
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3890
    editActions := suggestions collect:[:word |
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3891
                     self editActionToReplaceNode:node by:word.
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3892
                   ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3893
    actionBlock value:suggestionsWithInfo value:editActions value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3894
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3895
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3896
    "Modified: / 16-02-2010 / 10:13:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  3897
    "Modified (comment): / 12-06-2017 / 12:34:46 / mawalch"
5552
2fe0fa28ecf5 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5551
diff changeset
  3898
    "Modified: / 22-06-2017 / 06:56:42 / cg"
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  3899
    "Modified: / 03-03-2019 / 22:51:33 / Claus Gittinger"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3900
!
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3901
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3902
editActionToInsert:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3903
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3904
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3905
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3906
                codeView insertSelectedStringAtCursor:aString.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3907
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3908
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3909
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3910
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3911
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3912
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3913
editActionToInsertFromSuggestions:suggestions
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3914
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3915
        |answer|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3916
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3917
        answer := suggestions at:index.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3918
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3919
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3920
                codeView insertSelectedStringAtCursor:answer.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3921
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3922
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3923
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3924
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3925
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3926
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3927
editActionToReplaceCodeFrom:start to:stop by:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3928
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3929
        |oldVar oldLen newLen insertWithSpace|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3930
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3931
        insertWithSpace := false.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3932
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3933
        start <= stop ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3934
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3935
        ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3936
            codeView characterBeforeCursor == Character space ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3937
                insertWithSpace := true.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3938
            ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3939
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3940
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3941
        oldLen := stop - start + 1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3942
        newLen := aString size.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3943
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3944
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3945
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3946
                insertWithSpace ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3947
                    codeView insertSelectedStringAtCursor:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3948
                ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3949
                    codeView replaceFromCharacterPosition:start to:stop with:aString.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3950
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3951
                    (aString startsWith:oldVar) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3952
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3953
                    ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3954
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3955
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3956
                ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3957
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3958
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3959
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3960
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3961
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3962
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3963
    "Created: / 01-05-2016 / 18:47:40 / cg"
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3964
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3965
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3966
editActionToReplaceCodeFrom:start to:stop byWordIn:suggestions
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3967
    ^ [:index |
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3968
        |answer oldVar oldLen newLen insertWithSpace|
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3969
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3970
        insertWithSpace := false.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3971
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3972
        answer := suggestions at:index.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3973
        start <= stop ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3974
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3975
        ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3976
            codeView characterBeforeCursor == Character space ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3977
                insertWithSpace := true.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3978
            ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3979
        ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3980
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3981
        oldLen := stop - start + 1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3982
        newLen := answer size.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3983
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3984
        codeView
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3985
            undoableDo:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3986
                insertWithSpace ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3987
                    codeView insertSelectedStringAtCursor:answer
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3988
                ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3989
                    codeView replaceFromCharacterPosition:start to:stop with:answer.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3990
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3991
                    (answer startsWith:oldVar) ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3992
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3993
                    ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3994
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3995
                    ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3996
                ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3997
                codeView dontReplaceSelectionOnInput
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3998
            ]
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3999
            info:'Completion'.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4000
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4001
    ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4002
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4003
    "Created: / 01-05-2016 / 18:47:40 / cg"
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4004
!
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4005
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4006
editActionToReplaceNode:node by:word
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4007
    ^ self editActionToReplaceCodeFrom:node start to:node stop by:word
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4008
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4009
    "Created: / 01-05-2016 / 18:44:09 / cg"
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4010
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4011
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4012
editActionToReplaceNode:node byWordIn:suggestions
5114
856f583b1fff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5113
diff changeset
  4013
    ^ self editActionToReplaceCodeFrom:(node start) to:(node stop) byWordIn:suggestions
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4014
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4015
    "Created: / 01-05-2016 / 18:44:09 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4016
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4017
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4018
findBest:node for:selector inClasses:srchClassesArg
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  4019
    "find the best suggestions for a partial selector in a given set of classes.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  4020
     Notice: the returned collection is unsorted; it needs some postprocessing to
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  4021
     present the most reasonable items first"
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  4022
     
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4023
    |srchClasses bestSelectors
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4024
     allMessagesSentToVariable classesImplementingAllMessages|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4025
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4026
    srchClasses := srchClassesArg.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4027
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4028
        Transcript show:'node: '; showCR:node.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4029
        Transcript show:'srchClasses: '; showCR:srchClasses.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4030
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4031
    
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4032
    srchClasses isEmptyOrNil ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4033
        node isVariable ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4034
            allMessagesSentToVariable := Set new.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4035
            rememberedNodes do:[:eachNode |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4036
                eachNode allMessageNodesDo:[:eachMessage |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4037
                    |msgReceiver msgSelector|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4038
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4039
                    (msgReceiver := eachMessage receiver) isVariable ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4040
                        msgReceiver name = node name ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4041
                            (msgSelector := eachMessage selector) ~= selector ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4042
                                allMessagesSentToVariable add:msgSelector
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4043
                            ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4044
                        ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4045
                    ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4046
                ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4047
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4048
            allMessagesSentToVariable notEmpty ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4049
                "/ consider classes which implement all those messages.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4050
                classesImplementingAllMessages := Smalltalk allImplementorsOf:(allMessagesSentToVariable first).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4051
                allMessagesSentToVariable do:[:eachSelector |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4052
                    classesImplementingAllMessages := classesImplementingAllMessages
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4053
                                                        select:[:cls | cls implements:eachSelector].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4054
                ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4055
                srchClasses := classesImplementingAllMessages.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4056
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4057
        ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4058
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4059
    bestSelectors := Set new.
5514
8f0a8c426831 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5512
diff changeset
  4060
    (srchClasses isEmptyOrNil or:[srchClasses size > 100]) ifTrue:[
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4061
        bestSelectors addAll:( Parser findBest:50 selectorsFor:selector in:nil forCompletion:true ).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4062
        Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4063
            Transcript show:'bestSelectors (1): '; showCR:bestSelectors.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4064
        ].
5514
8f0a8c426831 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5512
diff changeset
  4065
    ] ifFalse:[          
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4066
        srchClasses do:[:srchClass |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4067
            |bestForThisClass|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4068
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4069
            bestForThisClass := Parser findBest:50 selectorsFor:selector in:srchClass forCompletion:true.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4070
            bestForThisClass := self
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4071
                                withoutSelectorsUnlikelyFor:srchClass
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4072
                                from:bestForThisClass
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4073
                                forPartial:selector.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4074
            Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4075
                Transcript show:'bestSelectors (2): '; showCR:bestForThisClass.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4076
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4077
            bestSelectors addAll:bestForThisClass.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4078
        ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4079
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4080
    "/ remove the already typed-in selector itself, in case.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4081
    bestSelectors remove:selector ifAbsent:[].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4082
    bestSelectors := bestSelectors asOrderedCollection.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4083
    ^ bestSelectors
5514
8f0a8c426831 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5512
diff changeset
  4084
8f0a8c426831 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5512
diff changeset
  4085
    "Modified: / 13-03-2017 / 18:07:28 / cg"
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  4086
    "Modified (comment): / 15-09-2017 / 11:00:01 / cg"
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4087
!
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4088
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4089
findNodeForInterval:interval in:source
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  4090
    ^ self class findNodeForInterval:interval in:source
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4091
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4092
    "Modified: / 06-07-2011 / 12:42:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4093
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4094
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4095
findNodeForInterval:interval in:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4096
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4097
	findNodeForInterval:interval in:source allowErrors:allowErrors
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4098
	mustBeMethod:false
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4099
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4100
    "Modified: / 16-09-2011 / 14:52:28 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4101
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4102
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4103
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4104
    "if mustBeMethod is true, do not try a regular expression (as in a workspace)."
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4105
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4106
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4107
	findNodeForInterval:interval in:source allowErrors:allowErrors
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4108
	mustBeMethod:mustBeMethod mustBeExpression:false
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4109
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4110
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4111
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod mustBeExpression:mustBeExpression
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4112
    "parse source, and find the node which is in the given interval 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4113
     (typically a selection or a word in the source).
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4114
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4115
     parse it as expression or method;
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4116
        if mustBeMethod is true, do not try as expression;
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4117
        if mustBeExpression is true, do not try as method
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4118
     expression syntax parsing is done in workspaces (doIt).
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4119
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4120
     Big hack as workaround a limitation of RBParser:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4121
     in case of an error, the parent chain of a node is usually not yet set.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4122
     (because the code is written as: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4123
        parentNode addChild:(self parseChild)
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4124
     and the parent-chain of the parsed child is set in addChild).
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4125
     However:
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4126
        when doing code completion, having invalid syntax to parse is the normal case.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4127
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4128
     Workaround:
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4129
        remember created nodes as the parse proceeds.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4130
        Thus, I can construct a partial the parent chain.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4131
    "
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4132
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4133
    |language intersectingNodes smallestIntersectingNode firstIntersectingNode
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4134
     lastIntersectingNode onErrorBlock
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  4135
     nodeGenerationHook parserClass parser currentScopeNodes bestNode|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4136
5900
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4137
    partialString := nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4138
    interval isEmpty ifTrue: [^ nil].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4139
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4140
    (language := languageOrNil) isNil ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4141
        classOrNil notNil ifTrue:[
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4142
            language := classOrNil programmingLanguage
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4143
        ] ifFalse:[
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4144
            language := SmalltalkLanguage instance
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4145
        ]
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  4146
    ].
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4147
    parserClass := language parserClass.
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4148
    (parserClass ? RBParser) == Parser ifTrue:[
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4149
        "/ hack use RBParser, when Parser was returned by language
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4150
        parserClass := RBParser.
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  4151
    ].
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  4152
    parserClass isNil ifTrue: [^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4153
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  4154
    rememberedScopeNodes := nil.
4434
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
  4155
    rememberedNodes := OrderedCollection new.
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  4156
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4157
    "/ LastSource := nil.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4158
    source = LastSource ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4159
        tree := LastParseTree.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4160
        tokens := LastScanTokens.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4161
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4162
        intersectingNodes := OrderedCollection new.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4163
        currentScopeNodes := IdentitySet new.
5900
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4164
        
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4165
        onErrorBlock :=
5900
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4166
            [:str :err :nodesSoFarFromParser |
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4167
                |nodes nodesSoFar partialStringStart partialStringEnd|
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4168
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4169
                nodesSoFar := nodesSoFarFromParser.
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4170
                ((str includesString:'Unmatched') and:[str includesString:' in string literal']) ifTrue:[
5910
1f6e0165088c #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5901
diff changeset
  4171
                    parser isNil ifTrue:[
1f6e0165088c #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5901
diff changeset
  4172
                        "/ happesn during init of parser, when the first step is done before
1f6e0165088c #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5901
diff changeset
  4173
                        "/ parser is set (and returned) - sigh.
5911
3cb8e229215c #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5910
diff changeset
  4174
                        ^ nil
5910
1f6e0165088c #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5901
diff changeset
  4175
                    ].   
5900
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4176
                    partialStringStart := parser scanner tokenStart.
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4177
                    partialStringEnd := parser scanner currentPosition.
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4178
                    (source at:partialStringStart) == $' ifTrue:[partialStringStart := partialStringStart + 1].
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4179
                    partialString := source copyFrom:partialStringStart to:partialStringEnd.
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4180
                    partialStringInterval := partialStringStart to:partialStringEnd.
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4181
                    "/ error is reported by scanner - no nodesSoFar passed in
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4182
                    nodesSoFar := parser nodesSoFar.
5901
3784750b3bc5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5900
diff changeset
  4183
                    ^ nodesSoFar detectMax:[:node | node endPosition ? -1]
5900
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4184
                ].    
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4185
                allowErrors ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4186
                    rememberedScopeNodes := currentScopeNodes.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4187
                    firstIntersectingNode notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4188
                        ^ firstIntersectingNode
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4189
                    ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4190
                    nodesSoFar notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4191
                        nodes := nodesSoFar asOrderedCollection
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4192
                                    collect:[:nd | nd whichNodeIntersects:interval]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4193
                                    thenSelect:[:nd | nd notNil ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4194
                        nodes size == 1 ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4195
                            ^ nodes first
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4196
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4197
                    ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4198
                ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4199
                nil
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4200
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4201
5658
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4202
        self debuggingCodeFor:#DWIM is:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4203
            Transcript show:'looking for: '; showCR:interval.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4204
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4205
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4206
        nodeGenerationHook :=
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4207
            [:node |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4208
                rememberedNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4209
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4210
                "/ would like to return here as soon as the node has been created by the parser;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4211
                "/ however, at that time, its parent(chain) is not yet created and so we might not know
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4212
                "/ what the semantic interpretation (especially: scope of variable) will be.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4213
                "/ therefore, we parse all, and return the found node at the end.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4214
                (node isMethod or:[node isBlock or:[node isSequence]]) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4215
                    currentScopeNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4216
                ] ifFalse:[
5658
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4217
                    self debuggingCodeFor:#DWIM is:[
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4218
                        node isMessage ifTrue:[
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4219
                            Transcript show:node; show:' '; show:node start; show:'->'; showCR:node stop.
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4220
                        ].
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4221
                    ].
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4222
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4223
                    (node intersectsInterval:interval) ifTrue:[
5658
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4224
                        self debuggingCodeFor:#DWIM is:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4225
                            Transcript showCR:'yes'.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4226
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4227
                        intersectingNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4228
                        firstIntersectingNode isNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4229
                            firstIntersectingNode := lastIntersectingNode := smallestIntersectingNode := node
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4230
                        ] ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4231
                            |lenNode lenSmallest|
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4232
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4233
                            lenNode := (node stop - node start).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4234
                            lenSmallest := (smallestIntersectingNode stop - smallestIntersectingNode start).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4235
                            lenNode < lenSmallest ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4236
                                smallestIntersectingNode := node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4237
                            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4238
                            node start > lastIntersectingNode start ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4239
                                lastIntersectingNode := node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4240
                            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4241
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4242
                    ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4243
                ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4244
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4245
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4246
        "/ one of the big problems when using the RBParser here is
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4247
        "/ that it behaves badly when a syntax error is encountered;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4248
        "/ for example, a node's parent is usually set AFTER the children are
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4249
        "/ completely parsed (for example, a blockNode gets the parent-method only
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4250
        "/ after parsing). Thus, when an error is encountered, we cannot walk
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4251
        "/ the parent chain, and therefore will not see the outer locals/args of
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4252
        "/ an inner scope (allVariablesOnScope returns only a partial set).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4253
        "/ A walkaround is to remember Method/Block nodes as created in the above node generation.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4254
        "/ The disadvantage of it is that we do not have correct scope information, until the node's
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4255
        "/ parent gets set eventually, thus we might consider locals from sibling blocks.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4256
        "/ See rememberedScopeNodes handling above.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4257
        "/ Those other nodes are only remembered for failed parses;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4258
        "/ if the parse is ok, rememberedScopeNodes will be nil.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4259
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4260
        mustBeExpression ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4261
            tree := parserClass
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4262
                        parseMethod: source
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4263
                        setup:[:p |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4264
                            parser := p.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4265
                            p rememberNodes:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4266
                            p rememberTokens:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4267
                            p nodeGenerationCallback:nodeGenerationHook
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4268
                        ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4269
                        onError: onErrorBlock.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4270
            parser notNil ifTrue:[ tokens := parser rememberedTokens ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4271
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4272
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4273
        mustBeMethod ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4274
            "/ only cache parsed methods
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4275
            tree notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4276
                LastSource := source.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4277
                LastParseTree := tree.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4278
                LastScanTokens := tokens.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4279
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4280
        ] ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4281
            (tree isNil or:[firstIntersectingNode isNil]) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4282
                "/ try as an expression
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4283
                tree := parserClass
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4284
                            parseExpression: source
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4285
                            setup:[:p |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4286
                                parser := p.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4287
                                p rememberNodes:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4288
                                p rememberTokens:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4289
                                p nodeGenerationCallback:nodeGenerationHook
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4290
                            ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4291
                            onError: onErrorBlock.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4292
                parser notNil ifTrue:[ tokens := parser rememberedTokens ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4293
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4294
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4295
        lastIntersectingNode notNil ifTrue:[
5658
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4296
            self debuggingCodeFor:#DWIM is:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4297
                Transcript show:'last: '; showCR:lastIntersectingNode.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4298
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4299
            ^ lastIntersectingNode
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4300
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4301
        "/ firstIntersectingNode notNil ifTrue:[ ^ firstIntersectingNode ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4302
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4303
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4304
    bestNode := self findNodeForInterval:interval inParseTree:tree.
5658
22ffe8e819d6 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5637
diff changeset
  4305
    self debuggingCodeFor:#DWIM is:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4306
        Transcript show:'best: '; showCR:bestNode.
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4307
    ].
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4308
    ^ bestNode
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4309
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4310
    "Created: / 16-09-2011 / 14:52:08 / cg"
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  4311
    "Modified: / 18-09-2013 / 16:47:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4312
    "Modified (comment): / 01-05-2016 / 10:05:10 / cg"
5911
3cb8e229215c #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5910
diff changeset
  4313
    "Modified: / 22-09-2018 / 09:40:57 / Claus Gittinger"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4314
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4315
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4316
findNodeForInterval:interval inParseTree:parseTree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4317
    |node|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4318
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4319
    interval isEmpty ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4320
    parseTree isNil ifTrue:[^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4321
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4322
    node := parseTree whichNodeIsContainedBy:interval.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4323
    node isNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4324
	node := parseTree whichNodeIntersects:interval.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4325
	node isNil ifTrue: [
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4326
	    node := self findNodeIn:parseTree forInterval:interval
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4327
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4328
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4329
    ^ node
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4330
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4331
    "Modified: / 10-11-2006 / 13:13:58 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4332
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4333
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  4334
findNodeIn:aTree forInterval:anInterval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  4335
    ^ self class findNodeIn:aTree forInterval:anInterval
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4336
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4337
    "Modified: / 20-11-2006 / 12:31:12 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4338
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4339
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4340
insertAdditonalStuffAfterSelector:chosenCompletion
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4341
    |optionalExtraSpace|
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4342
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4343
    optionalExtraSpace := (codeView characterAfterCursor isSeparator)
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4344
                            ifTrue:['']
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4345
                            ifFalse:[' '].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4346
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4347
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4348
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4349
            'ifTrue:' 'ifFalse:' 'ifTrue:ifFalse:' 'ifFalse:ifTrue:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4350
            'and:' 'or:' 'timesRepeat:' 'whileTrue:' 'whileFalse:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4351
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4352
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4353
        codeView insertStringAtCursor:('[',optionalExtraSpace,']').
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4354
        "/ codeView cursorLeft:1+extra size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4355
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4356
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4357
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4358
            'collect:' 'select:' 'reject:' 'do:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4359
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4360
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4361
        codeView insertStringAtCursor:('[:each | ]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4362
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4363
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4364
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4365
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4366
            'contains:' 'findFirst:' 'detect:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4367
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4368
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4369
        codeView insertStringAtCursor:('[:some | ]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4370
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4371
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4372
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4373
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4374
            'remove:ifAbsent:' 'detect:ifNone:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4375
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4376
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4377
        codeView insertStringAtCursor:('[]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4378
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4379
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4380
!
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4381
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4382
messagesSentTo:varName in:aTree
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4383
    |messagesToReceiver collector|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4384
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4385
    collector :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4386
        [:node | 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4387
            (node isMessage 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4388
            and:[node receiver isVariable
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4389
            and:[node receiver name = varName]]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4390
                messagesToReceiver add:(node selector)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4391
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4392
        ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4393
        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4394
    "/ collect messages sent
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4395
    messagesToReceiver := Set new.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4396
    "/ remembered nodes is nonNil if parser aborted with error
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4397
    rememberedNodes notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4398
        rememberedNodes do:collector.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4399
    ] ifFalse:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4400
        tree allMessageNodesDo:collector.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4401
    ]. 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4402
    ^ messagesToReceiver
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4403
!
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4404
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4405
old_askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4406
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4407
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4408
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4409
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4410
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4411
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4412
    LastChoices notNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4413
	lastChoice := LastChoices at:what ifAbsent:nil.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4414
	lastChoice notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4415
	    "/ move tha last choice to the top of the list, if it is in.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4416
	    (list includes: lastChoice) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4417
		(list indexOf: lastChoice) < 10 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4418
		    list := {lastChoice allBold } , (list copyWithout:lastChoice).
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4419
		]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4420
	    ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4421
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4422
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4423
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4424
    list size < 30 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4425
	|menu idx exitKey|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4426
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4427
	menu := PopUpMenu labels:list.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4428
	menu hideOnKeyFilter:[:key | |hide|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4429
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4430
		hide ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4431
		    exitKey := key.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4432
		].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4433
		hide].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4434
	menu memorizeLastSelection:3 "sigh, not 1 because of heading!!".
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4435
	idx := menu startUpWithHeading:'Choose ',what.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4436
	idx == 0 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4437
	    exitKey notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4438
		codeView keyPress:exitKey x:0 y:0.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4439
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4440
	    ^ nil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4441
	].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4442
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4443
    ] ifFalse:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4444
	resources := codeView application isNil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4445
			ifTrue:[ codeView resources]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4446
			ifFalse:[ codeView application resources ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4447
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4448
	choice := Dialog
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4449
	   choose:(resources string:'Choose ',what)
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4450
	   fromList:list
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4451
	   lines:20
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4452
	   initialSelection:(list firstIfEmpty:nil)
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4453
	   title:(resources string:'Code completion').
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4454
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4455
    ].
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  4456
    choice := choice string.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4457
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4458
    LastChoices isNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4459
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4460
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4461
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4462
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4463
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4464
    "Created: / 16-02-2010 / 09:38:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4465
    "Modified: / 28-08-2013 / 15:28:01 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4466
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4467
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4468
sortSelectors:list forSelector:selector lcSelector:lcSelector
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4469
    list sort: [:a :b |
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4470
        |aBeforeB|
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4471
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4472
"/        (a startsWith:'sho') ifTrue:[
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4473
"/            (b startsWith:'sho') ifTrue:[
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4474
"/                self halt.
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4475
"/            ].
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4476
"/        ].
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4477
        
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4478
        (a startsWith:selector) ifTrue:[
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4479
            (b startsWith:selector) ifTrue:[
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4480
                aBeforeB := (a size < b size) or:[a < b]
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4481
            ] ifFalse:[
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4482
                aBeforeB := true
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4483
            ] 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4484
        ] ifFalse:[    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4485
            (b startsWith:selector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4486
                aBeforeB := false
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4487
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4488
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4489
        aBeforeB isNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4490
            aBeforeB := a asLowercase < b asLowercase.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4491
            (a asLowercase startsWith:lcSelector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4492
                (b asLowercase startsWith:lcSelector) ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4493
                    aBeforeB := true
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4494
                ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4495
            ] ifFalse:[    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4496
                (b asLowercase startsWith:lcSelector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4497
                    aBeforeB := false
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4498
                ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4499
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4500
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4501
        aBeforeB
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4502
    ].
5613
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4503
46c0f7f9b92c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5612
diff changeset
  4504
    "Modified: / 30-09-2017 / 14:10:06 / cg"
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4505
!
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4506
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4507
sortUsefulSelectorsIn:selectorList
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4508
    "/ cosmetics: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4509
    "/  ifTrue / whileTrue should come before ifFalse/whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4510
    #(
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4511
        ifTrue:         ifFalse:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4512
        ifTrue:ifFalse: ifFalse:ifTrue:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4513
        whileTrue:      whileFalse:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4514
        whileTrue       whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4515
        whileTrue:      whileTrue
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4516
        whileFalse:     whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4517
        new:            basicNew:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4518
        new             basicNew
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4519
    ) pairWiseDo:[:sel1 :sel2 |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4520
        |idx1 idx2|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4521
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4522
        (idx1 := selectorList indexOf:sel1) ~~ 0 ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4523
            (idx2 := selectorList indexOf:sel2) ~~ 0 ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4524
                idx1 > idx2 ifTrue:[ 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4525
                    selectorList swap:idx1 with:idx2
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4526
                ] 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4527
            ] 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4528
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4529
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4530
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4531
    "Created: / 01-05-2016 / 17:48:02 / cg"
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4532
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4533
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4534
splitSelectorList:list by:condition
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4535
    |part1 part2 newList|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4536
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4537
    part1 := list select:condition.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4538
    part2 := list reject:condition.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4539
    part1 isEmpty ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4540
        newList := part2.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4541
    ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4542
        part2 isEmpty ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4543
            newList := part1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4544
        ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4545
            newList := part1 , part2.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4546
        ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4547
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4548
    ^ newList
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4549
!
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4550
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4551
treeForCode:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4552
    |tree|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4553
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4554
    source = LastSource ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4555
	tree := LastParseTree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4556
    ] ifFalse:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4557
	tree := RBParser
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4558
		parseMethod:source
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4559
		onError: [:str :err :nodesSoFar :parserOrNil|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4560
			allowErrors ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4561
			    "/ parserOrNil isNil if raised by the scanner
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4562
			    parserOrNil notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4563
				^ parserOrNil currentMethodNode
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4564
			    ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4565
			].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4566
			^ nil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4567
		    ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4568
		proceedAfterError:false
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4569
		rememberNodes:true.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4570
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4571
	tree notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4572
	    LastSource := source.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4573
	    LastParseTree := tree.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4574
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4575
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4576
    ^ tree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4577
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4578
    "Modified: / 13-01-2012 / 11:54:30 / cg"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4579
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4580
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4581
tryCodeCompletionWithSource:source nodeInterval:interval at:characterPositionOfCursor mustBeExpression:mustBeExpression into:actionBlock
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4582
    "this is tried multiple times;
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4583
        first with cursor line only
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4584
        then with the source copied up to the cursor position,
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4585
        then with the full source.
4381
43de05e6af6c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4379
diff changeset
  4586
     Either one may give better results (for example, when completing
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4587
     after a keyword selector, and the remaining code would lead to a syntactically
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4588
     legal, but stupid message send to be parsed...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4589
     (which happens often after inserting)"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4590
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4591
    |node nodeParent checkedNode characterBeforeCursor|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4592
5505
485ae56088f2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5504
diff changeset
  4593
    characterPositionOfCursor < 1 ifTrue:[^ self].
485ae56088f2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5504
diff changeset
  4594
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4595
    "/ this is too naive and stupid; if there is a syntactic error,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4596
    "/ we will not find a node for a long time (stepping back more and more,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4597
    "/ until reaching the beginning). This leads to a thousand and more times reparsing
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4598
    "/ without any progress.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4599
    "/ TODO: do it vice-versa, in that the parser does a callOut for every node generated
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4600
    "/ as it parses the code. Stop, when the interval is hit.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4601
    "/ that will also work for syntactic incorrect source code.
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4602
    (mustBeExpression not and:[methodOrNil notNil or:[classOrNil notNil]]) ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4603
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:true.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4604
    ].           
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4605
    node isNil ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4606
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false mustBeExpression:true.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4607
        node isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4608
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4609
            self information:'No parseNode found (syntax error before or in comment?)'.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4610
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4611
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4612
    ].
5900
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4613
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4614
    "/ if we are in a partial string,
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4615
    "/ try the special string-expansion hook (hook for expecco)
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4616
    partialString notNil ifTrue:[
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4617
        self codeCompletionForLiteralString:partialString node:node in:source considerAll:false into:actionBlock.
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4618
        ^ self.
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4619
    ].
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4620
    
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  4621
    "/ (source startsWith:'sel') ifTrue:[self halt].
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4622
    nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4623
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4624
    (node isVariable
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4625
      and:[ nodeParent notNil
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4626
      and:[ nodeParent isMessage
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4627
      and:[ node stop < (characterPositionOfCursor-1) ]]]
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4628
    ) ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4629
        node := nodeParent.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4630
        nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4631
    ].
5508
6215fe395e12 #BUGFIX by mawalch
mawalch
parents: 5505
diff changeset
  4632
    (characterPositionOfCursor-1 max:1) > source size ifTrue:[^ self].
4525
71ebd312132a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4524
diff changeset
  4633
    characterBeforeCursor := source at:(characterPositionOfCursor-1 max:1). "/ codeView characterBeforeCursor.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4634
    characterBeforeCursor isNil ifTrue:[ "at begin of line" ^ self].
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  4635
    characterBeforeCursor == $. ifTrue:[ "at end of statement" ^ self].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4636
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4637
    node isVariable ifTrue:[
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4638
        |nodeIsInTemporariesDecl nodeIsInBlockArgumentsDecl nodeIsInMethodArgumentsDecl |
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4639
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4640
        nodeIsInTemporariesDecl :=
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4641
            nodeParent notNil
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4642
            and:[ nodeParent isSequence
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4643
            and:[ nodeParent temporaries notEmptyOrNil
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4644
            and:[ node stop <= nodeParent temporaries last stop ]]]. 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4645
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4646
        nodeIsInBlockArgumentsDecl :=
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4647
            node blockScope notNil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4648
            and:[ node blockScope arguments notEmptyOrNil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4649
            and:[ node stop <= node blockScope arguments last stop ]].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4650
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4651
        (nodeIsInBlockArgumentsDecl not and:[rememberedScopeNodes notNil]) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4652
            "/ sigh - parent (and therefore blockScope) is unknown if parser has error
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4653
            nodeIsInBlockArgumentsDecl := 
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4654
                rememberedScopeNodes 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4655
                    contains:[:scope |
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4656
                        |scopeArgs|
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4657
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4658
                        (scope isMethod or:[scope isBlock])
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4659
                        and:[(scopeArgs := scope arguments) notEmptyOrNil
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4660
                        and:[scopeArgs first start <= node start
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4661
                        and:[scopeArgs last stop >= node stop]]].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4662
                    ].        
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4663
        ].
6149
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4664
        nodeIsInTemporariesDecl ifTrue:[ self codeCompletionForTempVariable:node into:actionBlock. ^ self ]. 
d8d846da0364 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 6138
diff changeset
  4665
        nodeIsInBlockArgumentsDecl ifTrue:[ self codeCompletionForBlockArgument:node into:actionBlock. ^ self ]. 
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4666
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4667
        "/ for variable completion, cursor must be right after the node 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4668
        codeView characterPositionOfCursor = (node stop + 1) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4669
            codeView characterBeforeCursor ~= Character space ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4670
                self codeCompletionForVariable:node into:actionBlock.
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4671
                ^ self.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4672
            ]. 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4673
        ].
5523
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4674
        "/ if right after a global, which is a class, look for implemented instance creation methods; offer them
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4675
        node isGlobal ifTrue:[
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4676
            |class instCreators selectors|
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4677
            
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4678
            (class := Smalltalk classNamed:node name) notNil ifTrue:[
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4679
                (instCreators := class theMetaclass methodsInCategory:'instance creation') notEmpty ifTrue:[
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4680
                    selectors := instCreators collect:[:m | m selector].
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4681
                    actionBlock 
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4682
                        value:selectors 
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4683
                        value:(selectors collect:[:sel | self editActionToInsert:sel])
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4684
                        value:'instance creation'.
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4685
                ].
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4686
            ].    
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4687
        ]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4688
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4689
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4690
false ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4691
        codeView characterPositionOfCursor = (node stop + 2) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4692
            |classes cls| 
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4693
            "/ after a variable;
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4694
            "/ offer local messages, if receiver type is known
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4695
            classes := (self classesOfNode:node).
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4696
            classes notEmptyOrNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4697
                classes size > 1 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4698
                    cls := classes anElement.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4699
                ] ifFalse:[    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4700
                    cls := Behavior commonSuperclassOf:classes.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4701
                ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4702
            ]. 
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4703
            cls notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4704
                |clsSelectors moreSelectors|
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4705
            
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4706
                "/ completion in a message-send
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4707
                clsSelectors := cls methodDictionary keys. "/ Parser findBest:50 selectorsFor:'' in:cls forCompletion:true.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4708
                clsSelectors size < 30 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4709
                    cls superclass notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4710
                        moreSelectors := cls superclass methodDictionary keys.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4711
                        clsSelectors size + moreSelectors size < 30 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4712
                            clsSelectors := clsSelectors , moreSelectors.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4713
                        ].
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4714
                    ].    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4715
                ].
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4716
                "/ self codeCompletionForMessage:checkedNode into:actionBlock.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4717
                actionBlock value:clsSelectors value:nil value:nil.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4718
                ^ self.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4719
            ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4720
        ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4721
].
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4722
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4723
    node isLiteral ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4724
        "/ however, user may want to complete a symbol inside a literal array!!
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4725
        node value isArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4726
            node token isLiteralArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4727
                |elementBeforeCursor searcher|
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4728
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4729
                elementBeforeCursor := node token value detect:[:anElementToken | characterPositionOfCursor == (anElementToken stop + 1)] ifNone:nil.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4730
                elementBeforeCursor isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4731
                    searcher :=
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4732
                        [:tok :check |
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4733
                            tok isLiteralArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4734
                                tok value inject:nil into:[:found :el | found ifNil:[searcher value:el value:check]]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4735
                            ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4736
                                (check value:tok) ifTrue:[tok] ifFalse:[nil]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4737
                            ]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4738
                        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4739
                    elementBeforeCursor := searcher value:node token value:[:anElementToken | characterPositionOfCursor == (anElementToken stop)].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4740
                ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4741
                (elementBeforeCursor notNil and:[ elementBeforeCursor value isSymbol ]) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4742
                    self codeCompletionForLiteralSymbol:nil element:elementBeforeCursor considerAll:true into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4743
                    ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4744
                ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4745
            ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4746
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4747
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4748
        "/ cursor must be right after the literal
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4749
        characterPositionOfCursor == (node stop + 1) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4750
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4751
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4752
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4753
        node value isSymbol ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4754
            self codeCompletionForLiteralSymbol:node element:nil considerAll:false into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4755
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4756
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4757
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4758
        "/ huh - completing strings, numbers or what?
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4759
        (nodeParent notNil
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4760
            and:[ nodeParent isMessage
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4761
            and:[ nodeParent isKeyword ]])
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4762
        ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4763
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4764
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4765
        "/ no, move up and try completing the outer keyword message (next arg)
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4766
        node := nodeParent.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4767
        nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4768
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4769
5050
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4770
    Verbose == true ifTrue:[
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4771
        Transcript show:'node is '.
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4772
        Error ignoreIn:[ Transcript show:node ].
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4773
        Transcript cr.
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4774
    ].
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4775
    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4776
    "/ if in a keyword-argument position...
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4777
    node isMessage ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4778
        "/ where are we?
5379
0f89327edf3c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5370
diff changeset
  4779
        node selectorString last == $: "node selector isSymbol" ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4780
            characterBeforeCursor == $: ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4781
                |argIdx senders implementors receiverClasses selectorUpToCursor implementorOfSelectorUpToCursor|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4782
                "/ about to enter an argument?
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4783
                argIdx := node selectorParts keysAndValuesDetectKey:[:idx :part |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4784
                            part stop == (codeView characterPositionOfCursor-1). 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4785
                          ] ifNone:nil.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4786
                argIdx notNil ifTrue:[          
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4787
                    selectorUpToCursor := ((node selectorParts collect:#value) copyTo:argIdx) asStringWith:''.        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4788
                    implementors := Set new.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4789
                    "/ find senders of this message, and see if they call it with a block argument
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4790
                    "/ this takes too long for a completion;
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4791
                    "/    Smalltalk allClassesDo:[:cls |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4792
                    "/        cls instAndClassMethodsDo:[:m |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4793
                    "/            (m sendsMessageForWhich:[:sel | sel startsWith:node selector]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4794
                    "/                senders add:m
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4795
                    "/            ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4796
                    "/        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4797
                    "/    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4798
                    "/ therefore, restrict to a max. of 5 classes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4799
                    receiverClasses := self classesOfNode:node receiver.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4800
                    (receiverClasses notEmptyOrNil and:[receiverClasses size <= 5]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4801
                        receiverClasses do:[:eachPossibleReceiverClass |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4802
                            eachPossibleReceiverClass withAllSuperclassesDo:[:cls |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4803
                                cls methodDictionary keysAndValuesDo:[:sel :mthd |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4804
                                    (sel startsWith:selectorUpToCursor) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4805
                                        implementors add:mthd.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4806
                                        (sel = selectorUpToCursor) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4807
                                            implementorOfSelectorUpToCursor := implementorOfSelectorUpToCursor ? mthd
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4808
                                        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4809
                                    ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4810
                                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4811
                            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4812
                        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4813
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4814
                    implementorOfSelectorUpToCursor notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4815
                        |tree argName|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4816
                        
5123
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4817
                        SourceCodeManagerError handle:[:ex |
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4818
                        ] do:[    
5392
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4819
                            tree := implementorOfSelectorUpToCursor parseTree. 
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  4820
                            (tree notNil and:[tree argumentNames size >= argIdx]) ifTrue:[
5392
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4821
                                argName := tree argumentNames at:argIdx.
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4822
                                (argName includesString:'block' caseSensitive:false) ifTrue:[
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4823
                                    actionBlock value:{'[ "',argName,'" ]'}
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4824
                                                value:{ self editActionToInsert:('[ "',argName,'" ]') }
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4825
                                                value:'block argument'
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4826
                                ]. 
5123
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4827
                            ].
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4828
                        ].    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4829
                    ] ifFalse:[    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4830
                        implementors notEmpty ifTrue:[
5082
87e1ffeceb8a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5081
diff changeset
  4831
                            self breakPoint:#cg.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4832
                        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4833
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4834
                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4835
            ].    
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  4836
        ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4837
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4838
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4839
    (node isVariable or:[node isBlock and:[node stop notNil]]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4840
        (characterPositionOfCursor == (node stop + 1)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4841
        "/ hack (spaces at end of line)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4842
        or:[characterPositionOfCursor == (node stop)]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4843
            codeView characterBeforeCursor == Character space ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4844
                self codeCompletionForMessageTo:node into:actionBlock.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4845
                ^ self
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4846
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4847
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4848
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4849
5114
856f583b1fff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5113
diff changeset
  4850
    "/ characterBeforeCursor == $) ifTrue:[self halt].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  4851
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4852
    "/ move outward, until we find a message-send node,
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4853
    "/ or the method's selector pattern node.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4854
    checkedNode := node.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4855
    [checkedNode notNil] whileTrue:[
5322
407a341d0c83 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5312
diff changeset
  4856
        (characterPositionOfCursor <= ((checkedNode stop ? source size)+1)) ifTrue:[
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4857
            "/ Transcript show:'T: '; showCR:node.
5048
8dbd0140a2f0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5047
diff changeset
  4858
            "/ Transcript showCR:('Inside a ',(checkedNode className)).
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4859
            "/ self information:('Inside a ',(checkedNode className)).
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4860
            (checkedNode isMessage 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4861
            and:[characterPositionOfCursor < (checkedNode selectorParts first start)]) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4862
                self codeCompletionForMessageTo:checkedNode receiver into:actionBlock.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4863
                ^ self
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4864
            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4865
            
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4866
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4867
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4868
        checkedNode isMessage ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4869
            "/ completion in a message-send
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4870
            "/ Transcript showCR:'codeCompletionForMessage'.
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4871
            self codeCompletionForMessage:checkedNode into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4872
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4873
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4874
        checkedNode isMethod ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4875
            "/ completion in a method's selector pattern
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4876
            "/ Transcript showCR:'codeCompletionForMethodSpec'.
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4877
            self codeCompletionForMethodSpec:checkedNode into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4878
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4879
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4880
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4881
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4882
        checkedNode := checkedNode parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4883
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4884
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4885
    "/ Transcript showCR:'Node is neither variable nor message'.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4886
    self information:'Node is neither variable nor message.'.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4887
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4888
    "Modified: / 04-07-2006 / 18:48:26 / fm"
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  4889
    "Modified: / 08-04-2017 / 16:01:14 / cg"
5900
880fa5a89fb8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5869
diff changeset
  4890
    "Modified: / 29-08-2018 / 16:43:14 / Claus Gittinger"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4891
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4892
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4893
withoutSelectorsUnlikelyFor:aClass from:selectorsArg forPartial:partialSelector
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4894
    "some heuristics;
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4895
     as best selectors has been chosen by implemented methods for aClass,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4896
     some of them should be filtered (for example, at:/at:put:, which are
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4897
     found in object, but only make sense for variable objects or those which do
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4898
     implement at:put: themself.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4899
     I have currently no better idea than hardcoding stuff I found irritating..."
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4900
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4901
    |selectors noNilChecks noIsXXXChecks noNoXXXChecks noBecome 
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4902
     noIndexedSetters noIndexedGetters noSizeQueries docSelectors|
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4903
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4904
    aClass isNil ifTrue:[ ^ selectorsArg ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4905
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4906
    noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := false.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4907
    noIndexedSetters := noIndexedGetters := noSizeQueries := false.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4908
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4909
    selectors := (selectorsArg ? #()) asOrderedCollection.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4910
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4911
    self tracePoint:#cg message:aClass.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4912
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4913
    aClass isMeta ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4914
        docSelectors := #(copyright documentation examples 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4915
                          version version_CVS version_SVN version_HG).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4916
        selectors := selectors reject:[:sel | docSelectors includes:sel].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4917
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4918
    
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4919
    "/ actually meaning booleans here
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4920
    (aClass == True or:[aClass == False]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4921
        noNilChecks := noBecome := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4922
        (partialSelector startsWith:'is') ifFalse:[ noIsXXXChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4923
        (partialSelector startsWith:'no') ifFalse:[ noNoXXXChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4924
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4925
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4926
    (aClass includesBehavior: ArithmeticValue) ifTrue:[ noNilChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4927
    (aClass includesBehavior: Symbol) ifTrue:[ noNilChecks := noBecome := noIndexedSetters := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4928
    (aClass includesBehavior: Number) ifTrue:[ noBecome := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4929
    (aClass includesBehavior: Block) ifTrue:[ noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4930
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4931
    (aClass isMeta) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4932
        noNilChecks := noBecome := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4933
        "/ remove messages which are only defined in Object and non-meta classes.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4934
        selectors := selectors reject:
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4935
            [:sel |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4936
                (Object implements:sel)
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4937
                and:[ (Smalltalk allImplementorsOf:sel) conform:[:impl | impl isMeta not]]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4938
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4939
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4940
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4941
    aClass isVariable ifFalse:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4942
        noIndexedGetters := noIndexedSetters := noSizeQueries := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4943
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4944
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4945
    noIndexedSetters ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4946
        #( #'at:put:' #'basicAt:put:') do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4947
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4948
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4949
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4950
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4951
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4952
    noIndexedGetters ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4953
        #( #'at:' #'basicAt:') do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4954
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4955
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4956
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4957
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4958
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4959
    noSizeQueries ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4960
        #( #size #basicSize ) do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4961
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4962
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4963
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4964
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4965
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4966
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4967
    noNilChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4968
        selectors removeAllFoundIn:#(
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4969
                    'isNil' 'notNil'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4970
                    'ifNil:' 'ifNotNil:' 'ifNil:ifNotNil:' 'ifNotNil:ifNil:' 'ifNotNilDo:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4971
                    'ifEmpty:' 'ifNotEmpty:' 'ifNotEmptyDo:' 'ifEmpty:ifNotEmpty:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4972
                    'ifEmpty:ifNotEmptyDo:' 'ifNotEmptyDo:ifEmpty:' 'ifEmptyDo:ifNotEmpty:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4973
                  ).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4974
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4975
    noIsXXXChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4976
        "/ get rid of all isXXX selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4977
        selectors := selectors reject:[:sel | sel startsWith:'is'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4978
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4979
    noNoXXXChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4980
        "/ get rid of all notXXX selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4981
        selectors := selectors reject:[:sel | sel startsWith:'no'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4982
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4983
    noBecome ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4984
        "/ get rid of all become* selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4985
        selectors := selectors reject:[:sel | sel startsWith:'become'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4986
        selectors remove:#oneWayBecome: ifAbsent:[].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4987
        selectors := selectors reject:[:sel | sel startsWith:'changeClassTo'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4988
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4989
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4990
    "/ actually: directly implemented selectors are more likely, so move them to top
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4991
    selectors := (selectors select:[:sel | aClass implements:sel])
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4992
                 ,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4993
                 (selectors reject:[:sel | aClass implements:sel]).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4994
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4995
    ^ selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4996
! !
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4997
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  4998
!DoWhatIMeanSupport methodsFor:'code completion - helpers-old'!
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4999
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5000
codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5001
    |sym possibleCompletions best start stop oldLen newLen oldVar|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5002
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5003
    sym := node value.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5004
    possibleCompletions := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5005
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5006
    Symbol allInstancesDo:[:existingSym |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5007
	(existingSym startsWith:sym) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5008
	    (existingSym = sym) ifFalse:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5009
		possibleCompletions add:existingSym
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5010
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5011
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5012
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5013
    possibleCompletions sort.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5014
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5015
    best := possibleCompletions longestCommonPrefix.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5016
    (best = sym or:[(possibleCompletions includes:best) not]) ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5017
	best := self askUserForCompletion:'symbol literal' for:codeView at: node start from:possibleCompletions.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5018
	best isNil ifTrue:[^ self].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5019
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5020
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5021
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5022
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5023
    start := node start.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5024
    stop := node stop.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5025
    (codeView characterAtCharacterPosition:start) == $# ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5026
	start := start + 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5027
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5028
    (codeView characterAtCharacterPosition:start) == $' ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5029
	start := start + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5030
	stop := stop - 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5031
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5032
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5033
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5034
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5035
    codeView
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5036
	undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5037
	info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5038
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5039
    (best startsWith:oldVar) ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5040
	oldLen := stop - start + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5041
	newLen := best size.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5042
	codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  5043
	codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5044
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5045
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5046
    "Modified: / 16-02-2010 / 10:15:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5047
    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5048
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5049
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5050
codeCompletionForMessage:node inClass:classOrNil instance:instanceOrNil context:contextOrNil codeView:codeView
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5051
    "going to be OBSOLETE"
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5052
    
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5053
    |selector
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5054
     bestSelectors selector2 bestSelectors2 bestSelectorsFromRB allBest best numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5055
     newParts nSelParts oldLen newLen selectorParts
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5056
     findBest parentNode selectorInBest selector2InBest2
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5057
     parser selectorsSentInCode selectorsImplementedInClass
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5058
     varName rbTypes rbType tryParent parentIsKeywordMessage parentIsBinaryMessage rcvrClass|
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5059
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5060
    RefactoryTyper notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5061
        "/ refactory package also provides a (very limited) typer;
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5062
        "/ ask it for its oppinion as well (temporary - will vanish, once we have a better typer)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5063
        (node receiver isVariable) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5064
            varName := node receiver name.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5065
            varName isUppercaseFirst ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5066
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5067
                tree := RBParser
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5068
                            parseMethod:codeView contents string
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5069
                            onError:[:aString :pos | nil].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5070
                tree notNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5071
                    rbTypes := RefactoryTyper
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5072
                                classesFor: varName
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5073
                                in: tree
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5074
                                model: nil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5075
                                ignoredSelectors:(Array with:node selector).
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  5076
                    rbTypes size ~~ 0 ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5077
                        rbTypes size > 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5078
                            rbTypes remove:ProtoObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5079
                            rbTypes remove:Autoload ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5080
                            rbTypes remove:ObsoleteObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5081
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5082
                        rbTypes size == 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5083
                            rbType := rbTypes first.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5084
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5085
                            rbType := Class commonSuperclassOf:rbTypes
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5086
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5087
                        (rbType notNil "and:[rbType ~= Object]") ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5088
                            bestSelectorsFromRB := Parser findBest:30 selectorsFor:node selector in:rbType forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5089
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5090
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5091
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5092
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5093
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5094
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5095
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5096
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5097
        parser := Parser parseMethod:codeView contents string in:classOrNil ignoreErrors:true ignoreWarnings:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5098
        selectorsSentInCode := parser messagesSent.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5099
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5100
    classOrNil notNil ifTrue:[
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5101
        selectorsImplementedInClass := Set new.
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5102
        classOrNil withAllSuperclassesDo:[:cls |
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5103
            cls theNonMetaclass ~~ Object ifTrue:[
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5104
                selectorsImplementedInClass addAll:cls selectors.
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5105
            ]
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5106
        ]    
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5107
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5108
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5109
    findBest := [:node :selector |
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5110
        |srchClasses bestSelectors bestPrefixes|
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5111
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  5112
        codeView withCursor:(Cursor questionMark) do:[
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5113
            srchClasses := self classesOfNode:node receiver.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5114
            srchClasses notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5115
                bestSelectors := Set new.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5116
                srchClasses do:[:each |
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5117
                    bestSelectors addAll:(Parser findBest:30 selectorsFor:selector in:each forCompletion:true).
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5118
                ]    
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5119
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5120
                bestSelectors := Parser findBest:30 selectorsFor:selector in:nil forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5121
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5122
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5123
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5124
        (bestSelectors includes:selector) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5125
            bestSelectors := bestSelectors select:[:sel | sel size > selector size].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5126
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5127
        bestSelectors
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5128
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5129
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5130
    selector := node selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5131
    bestSelectors := findBest value:node value:selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5132
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5133
    parentNode := node parent.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5134
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5135
    parentIsKeywordMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5136
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5137
            and:[ parentNode isMessage
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5138
            and:[ parentNode selector isKeyword]]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5139
    parentIsBinaryMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5140
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5141
            and:[ parentNode isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5142
            and:[ parentNode selector isBinarySelector]]).
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5143
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5144
    tryParent := false.
5471
289b60e70a2c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5462
diff changeset
  5145
    "/ if it's a unary message AND the parent is a keyword node, look for parent completion too.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5146
    (node selector isUnarySelector and:[ parentIsKeywordMessage ]) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5147
        tryParent := true.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5148
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5149
        "/ if the parent is an instance creation message, take that as lookup class.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5150
        (node isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5151
        and:[ node receiver isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5152
        and:[ node receiver receiver isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5153
        and:[ node receiver receiver name isUppercaseFirst
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5154
        and:[ #(new new:) includes:(selector2 := node receiver selector) ]]]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5155
            rcvrClass := Smalltalk classNamed:(node receiver receiver name).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5156
            "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5157
            bestSelectors := Parser findBest:30 selectorsFor:selector in:rcvrClass forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5158
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5159
            "/ also, if nothing was found
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5160
            (bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5161
            and:[ parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5162
            and:[ parentNode isMessage ]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5163
                "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5164
                "/ selector2 := parentNode selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5165
                "/ selector2 := selector2,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5166
                bestSelectors := findBest value:parentNode value:selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5167
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5168
        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5169
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5170
    tryParent ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5171
        selector2 := parentNode selector,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5172
        bestSelectors2 := findBest value:parentNode value:selector2.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5173
    ].
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5174
    bestSelectorsFromRB notEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5175
        bestSelectors := bestSelectorsFromRB , (bestSelectors reject:[:sel | bestSelectorsFromRB includes:sel]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5176
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5177
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5178
    "/ if the parent is a keyword selector, the child cannot
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5179
    (parentIsKeywordMessage or:[parentIsBinaryMessage]) ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5180
        bestSelectors := bestSelectors reject:[:sel | sel isKeyword]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5181
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5182
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5183
    bestSelectors2 isEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5184
        allBest := bestSelectors.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5185
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5186
        bestSelectors isEmptyOrNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5187
            allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5188
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5189
            selectorInBest := (bestSelectors contains:[:sel | sel asLowercase startsWith:selector asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5190
            selector2InBest2 := (bestSelectors2 contains:[:sel | sel asLowercase startsWith:selector2 asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5191
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5192
            (selectorInBest not and:[ selector2InBest2 ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5193
                "/ selector2 is more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5194
                allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5195
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5196
                (selectorInBest and:[ selector2InBest2 not ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5197
                    "/ selector more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5198
                    allBest := bestSelectors
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5199
                ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5200
                    "/ assume same likelyness
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5201
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5202
                    allBest := bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5203
                                ifTrue:[ bestSelectors2 ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5204
                                ifFalse:[ bestSelectors , #(nil) , bestSelectors2 ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5205
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5206
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5207
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5208
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5209
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5210
    allBest isEmptyOrNil ifTrue:[ ^ self ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5211
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5212
    selectorsImplementedInClass notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5213
        "/ the ones implemented in the receiver class are moved to the top of the list.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5214
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5215
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5216
                    by:[:sel | selectorsImplementedInClass includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5217
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5218
    selectorsSentInCode notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5219
        "/ the ones already sent in the code are moved to the top of the list.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5220
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5221
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5222
                    by:[:sel | selectorsSentInCode includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5223
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5224
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5225
    "/ the ones which are a prefix are moved towards the top of the list
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5226
    allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5227
                splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5228
                by:[:sel | sel notNil and:[sel startsWith:selector]].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5229
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5230
    best := allBest first.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5231
    allBest size > 1 ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5232
        "allBest size < 20 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5233
            |idx|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5234
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5235
            idx := (PopUpMenu labels:allBest) startUp.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5236
            idx == 0 ifTrue:[ ^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5237
            best := allBest at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5238
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5239
            allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5240
            best := Dialog request:'Matching selectors:' initialAnswer:best list:allBest.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5241
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5242
        ]."
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5243
        allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5244
        best := self askUserForCompletion:('Selector for "%1"' bindWith:selector) for:codeView at: node selectorParts first start from:allBest.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5245
        best isEmptyOrNil ifTrue:[^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5246
        best = '-' ifTrue:[^ self].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5247
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5248
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5249
"/    srchClass notNil ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5250
"/        implClass := srchClass whichClassIncludesSelector:best.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5251
"/    ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5252
"/        implClass := Smalltalk allClasses select:[:cls | (cls includesSelector:best) or:[cls class includesSelector:best]].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5253
"/        implClass size == 1 ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5254
"/            implClass := implClass first.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5255
"/        ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5256
"/            implClass := nil
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5257
"/        ]
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5258
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5259
"/
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5260
"/    info := best storeString.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5261
"/    implClass notNil ifTrue:[
6128
2690e07d6512 #OTHER by exept
Claus Gittinger <cg@exept.de>
parents: 6126
diff changeset
  5262
"/        info := implClass name , ' » ' , info.
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5263
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5264
"/    self information:info.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5265
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5266
    best ~= selector ifTrue:[
6138
1dd5dc49a996 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 6134
diff changeset
  5267
        numArgs := best argumentCount.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5268
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5269
        (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:best]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5270
            selectorParts := parentNode selectorParts , node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5271
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5272
            selectorParts := node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5273
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5274
        nSelParts := selectorParts size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5275
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5276
        newParts := best asCollectionOfSubstringsSeparatedBy:$:.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5277
        newParts := newParts select:[:part | part size > 0].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5278
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5279
        codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5280
            undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5281
                |newCursorPosition stop|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5282
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5283
                numArgs > nSelParts ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5284
                    stop := selectorParts last stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5285
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5286
                    "/ append the rest ...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5287
                    numArgs downTo:nSelParts+1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5288
                        |newPart|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5289
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5290
                        newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5291
                        (best endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5292
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5293
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5294
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5295
                        (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5296
                            newPart := ':' , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5297
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5298
                        newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5299
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5300
                        codeView replaceFromCharacterPosition:stop to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5301
                        newCursorPosition := stop + newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5302
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5303
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5304
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5305
                (nSelParts min:newParts size) downTo:1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5306
                    |newPart oldPartialToken start stop nextChar|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5307
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5308
                    newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5309
                    oldPartialToken := selectorParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5310
                    start := oldPartialToken start.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5311
                    stop := oldPartialToken stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5312
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5313
                    (best isKeyword) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5314
                        (oldPartialToken value endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5315
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5316
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5317
                            (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5318
                                newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5319
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5320
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5321
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5322
                        (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5323
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5324
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5325
                            nextChar := codeView characterAtCharacterPosition:stop+1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5326
                            nextChar isSeparator ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5327
                                (').' includes:nextChar) ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5328
                                    newPart := newPart , ' '
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5329
                                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5330
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5331
                        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5332
"/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5333
"/                        ] ifFalse:[
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5334
"/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5335
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5336
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5337
                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5338
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5339
                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5340
                    newCursorPosition isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5341
                        oldLen := stop - start + 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5342
                        newLen := newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5343
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5344
                        newCursorPosition := stop + (newLen-oldLen)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5345
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5346
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5347
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5348
                codeView cursorToCharacterPosition:newCursorPosition.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5349
                codeView cursorRight.  "/ avoid going to the next line !!
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5350
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5351
                ((best endsWith:':') and:[numArgs == 1]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5352
                    |impls impl|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5353
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5354
                    "/ see if it expects a block argument (heuristic)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5355
                    best := best asSymbol.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5356
                    (node notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5357
                    and:[classOrNil notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5358
                    and:[node receiver isSelf]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5359
                        (impl := classOrNil whichClassImplements:best) isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5360
                            impls := #().
5687
c5be8b9eff20 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5660
diff changeset
  5361
                            Screen current beepInEditor.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5362
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5363
                            impls := { impl }
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5364
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5365
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5366
                        impls := Smalltalk allImplementorsOf:best.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5367
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5368
                    (impls contains:[:cls |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5369
                        |argName|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5370
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5371
                        argName := ((cls compiledMethodAt:best) methodArgAndVarNames at:1) asLowercase.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5372
                        (argName includesString:'block') or:[ (argName includesString:'action')]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5373
                    ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5374
                        codeView insertStringAtCursor:'['
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5375
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5376
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5377
                codeView dontReplaceSelectionOnInput.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5378
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5379
        info:'Completion'.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5380
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5381
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5382
    "Created: / 10-11-2006 / 13:18:27 / cg"
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5383
    "Modified: / 16-02-2010 / 10:33:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5384
    "Modified: / 30-04-2016 / 18:21:21 / cg"
5471
289b60e70a2c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5462
diff changeset
  5385
    "Modified (comment): / 13-02-2017 / 20:37:55 / cg"
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  5386
    "Modified: / 01-03-2019 / 14:53:00 / Claus Gittinger"
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5387
!
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5388
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5389
codeCompletionForVariable:node inClass:classOrNil codeView:codeView
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5390
    |parent nonMetaClass crsrPos nm
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5391
     allVariables allDistances best nodeVal
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5392
     char start stop oldLen newLen oldVar
4485
c6ed849af389 class: DoWhatIMeanSupport
Stefan Vogel <sv@exept.de>
parents: 4484
diff changeset
  5393
     getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5394
     globalFactor localFactor selectorOfMessageToNode tree implementors argIdx namesUsed kwPart|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5395
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5396
    classOrNil notNil ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5397
        nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5398
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5399
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5400
    nm := node name.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5401
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5402
    "/ if we are behind the variable and a space has already been entered,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5403
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5404
    "/ If the variable represents a global, present its instance creation messages
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5405
    crsrPos := codeView characterPositionOfCursor.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5406
    char := codeView characterAtCharacterPosition:crsrPos-1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5407
    char isSeparator ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5408
        classOrNil isNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5409
            nodeVal := Smalltalk at:nm asSymbol.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5410
        ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5411
            nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5412
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5413
        nodeVal isBehavior ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5414
            |methods menu exitKey idx|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5415
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5416
            methods := nodeVal class methodDictionary values
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5417
                            select:[:m | 
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5418
                                |cat|
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5419
                                cat := m category.
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5420
                                cat notNil
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5421
                                and:[cat sameAs:'instance creation']
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5422
                            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5423
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5424
            menu := PopUpMenu labels:(methods collect:[:each | each selector]).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5425
            menu hideOnKeyFilter:[:key | |hide|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5426
                    hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5427
                    hide ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5428
                        exitKey := key.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5429
                    ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5430
                    hide].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5431
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5432
            idx := menu startUp.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5433
            idx == 0 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5434
                exitKey notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5435
                    codeView keyPress:exitKey x:0 y:0.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5436
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5437
                ^ self
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5438
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5439
            best := (methods at:idx) selector.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5440
            codeView
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5441
                undoableDo:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5442
                    codeView insertString:best atCharacterPosition:crsrPos.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5443
                    codeView cursorToCharacterPosition:crsrPos+best size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5444
                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5445
                info:'completion'.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5446
            ^ self.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5447
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5448
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5449
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5450
    ((parent := node parent) notNil and:[parent isMessage]) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5451
        node == parent receiver ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5452
            selectorOfMessageToNode := parent selector
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5453
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5454
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5455
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5456
    getDistanceComputeBlockWithWeight :=
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5457
        [:weight |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5458
            [:each |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5459
                |dist factor|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5460
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5461
                dist := each spellAgainst:nm.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5462
                factor := 1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5463
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5464
                (each startsWith:nm) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5465
                    factor := 6 * nm size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5466
                ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5467
                    (each asLowercase startsWith:nm asLowercase) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5468
                        factor := 4 * nm size.
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5469
                    ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5470
                        (each endsWith:nm) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5471
                            factor := 3 * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5472
                        ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5473
                            (each asLowercase endsWith:nm asLowercase) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5474
                                factor := 2 * nm size.
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  5475
                            ]
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  5476
                        ]
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  5477
                    ]
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5478
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5479
                dist := dist + (weight*factor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5480
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5481
                each -> (dist * weight)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5482
             ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5483
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5484
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5485
    addWithFactorBlock :=
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5486
        [:eachNames :factor | 
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5487
            |namesToAdd|
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5488
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5489
            namesToAdd := eachNames select:[:nameToAdd | nameToAdd ~= nm ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5490
            namesToAdd := namesToAdd reject:[:each | allVariables includes:each ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5491
            allVariables addAll:namesToAdd.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5492
            allDistances addAll:(namesToAdd collect:(getDistanceComputeBlockWithWeight value:factor)).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5493
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5494
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5495
    nm isUppercaseFirst ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5496
        globalFactor := 2.    "/ favour globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5497
        localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5498
    ] ifFalse:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5499
        globalFactor := 1.    "/ favour locals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5500
        localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5501
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5502
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5503
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5504
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5505
4308
f1c31624744d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4304
diff changeset
  5506
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5507
    ((parent := node parent) notNil
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5508
    and:[parent isMethod
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5509
    and:[parent arguments includes:node]]) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5510
        "/ now that's cool: look how the naem of this argument is in other implementations
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5511
        "/ of this method, and take that as a basis of the selection
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5512
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5513
        implementors := SystemBrowser
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5514
                            findImplementorsOf:(parent selector)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5515
                            in:(Smalltalk allClasses)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5516
                            ignoreCase:false.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5517
        "/ which argument is it
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5518
        argIdx := parent arguments indexOf:node.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5519
        implementors size > 50 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5520
            implementors := implementors asOrderedCollection copyTo:50.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5521
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5522
        namesUsed := implementors
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5523
                        collect:[:eachImplementor |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5524
                            |parseTree|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5525
                            parseTree := eachImplementor parseTree.
6013
36f85fdcc2eb #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5980
diff changeset
  5526
                            (parseTree notNil and:[parseTree arguments size ~~ 0])
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5527
                                ifFalse:nil
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5528
                                ifTrue:[ (parseTree arguments at:argIdx) name] ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5529
                        thenSelect:[:a | a notNil] as:Set.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5530
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5531
        addWithFactorBlock value:namesUsed value:(2 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5532
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5533
        classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5534
            "/ also, look for the keyword before the argument,
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5535
            "/ and see if there is such an instVar
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5536
            "/ if so, add it with -Arg
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5537
            parent selector isKeyword ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5538
                kwPart := parent selector keywords at:argIdx.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5539
                (classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5540
                    addWithFactorBlock
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5541
                        value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5542
                        value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5543
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5544
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5545
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5546
    ] ifFalse:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5547
        classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5548
            "/ locals in the block/method
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5549
            |names|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5550
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5551
            names := node allVariablesOnScope.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5552
            "/ if there were no variables (due to a parse error)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5553
            "/ do another parse and see what we have
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5554
            names isEmpty ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5555
                tree := self treeForCode:(codeView contentsAsString string) allowErrors:true.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5556
                "/ better if we already have a body (include locals then)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5557
                "/ otherwise, only the arguments are considered
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5558
                tree notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5559
                    names := (tree body ? tree) allVariablesOnScope.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5560
                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5561
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5562
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5563
            addWithFactorBlock value:names value:(4 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5564
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5565
            "/ instance variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5566
            addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5567
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5568
            "/ inherited instance variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5569
            classOrNil superclass notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5570
                addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5571
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5572
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5573
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5574
        selectorOfMessageToNode notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5575
            |names responders nonResponders|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5576
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  5577
            "/ responding to that message
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5578
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5579
            classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5580
                "/ private classes
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5581
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5582
                                   value:(1.75 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5583
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5584
                "/ class variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5585
                names := nonMetaClass classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5586
                responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5587
                nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5588
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5589
                addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5590
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5591
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5592
                "/ superclass var names
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5593
                nonMetaClass allSuperclassesDo:[:superClass |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5594
                    names := superClass classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5595
                    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5596
                    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5597
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5598
                    addWithFactorBlock value:responders value:(1 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5599
                    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5600
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5601
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5602
                "/ namespace vars
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5603
                classOrNil nameSpace ~~ Smalltalk ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5604
                    names := classOrNil topNameSpace keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5605
                    names := names reject:[:nm | nm includes:$:].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5606
                    names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5607
                    responders := names select:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5608
                    nonResponders := names reject:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5609
                    addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5610
                    addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5611
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5612
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5613
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5614
            "/ globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5615
            names := Smalltalk keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5616
            "/ names := names reject:[:nm | nm includes:$:].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5617
            names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5618
            responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5619
            nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5620
            addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5621
            addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5622
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5623
            "/ pool variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5624
            classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5625
                |pool|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5626
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5627
                pool := Smalltalk at:poolName.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5628
                names := pool classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5629
                names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5630
                responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5631
                nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5632
                addWithFactorBlock value:responders value:(2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5633
                addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5634
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5635
        ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5636
            |names|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5637
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5638
            classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5639
                "/ private classes
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5640
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5641
                                   value:(1.75 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5642
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5643
                "/ class variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5644
                addWithFactorBlock value:nonMetaClass classVarNames value:(2.0 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5645
                classOrNil superclass notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5646
                    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.0 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5647
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5648
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5649
                "/ namespace vars
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5650
                classOrNil nameSpace ~~ Smalltalk ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5651
                    names := classOrNil nameSpace isNameSpace ifTrue:[classOrNil nameSpace keys] ifFalse:[classOrNil nameSpace privateClasses collect:[:c | c nameWithoutPrefix]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5652
                    names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5653
                    addWithFactorBlock value:names value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5654
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5655
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5656
                "/ pool variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5657
                classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5658
                    |pool|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5659
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5660
                    pool := Smalltalk at:poolName.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5661
                    names := pool classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5662
                    addWithFactorBlock value:names value:(2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5663
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5664
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5665
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5666
            "/ globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5667
            names := Smalltalk keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5668
            names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5669
            addWithFactorBlock value:names value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5670
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5671
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5672
        "/ pseudos - assuming that thisContext is seldom used.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5673
        "/ also assuming, that nil is short so its usually typed in.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5674
        addWithFactorBlock value:#('self') value:(2.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5675
        addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5676
        addWithFactorBlock value:#('super' 'false') value:(2 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5677
        addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5678
        addWithFactorBlock value:#('true') value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5679
        addWithFactorBlock value:#('false') value:(1 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5680
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5681
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5682
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5683
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5684
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5685
                                                           ifTrue:[el]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5686
                                                           ifFalse:[best]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5687
                                                    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5688
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5689
    allDistances sort:[:a :b |
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5690
                                a value > b value ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5691
                                    true
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5692
                                ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5693
                                    a value = b value ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5694
                                        a key < b key
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5695
                                    ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5696
                                        false
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5697
                                    ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5698
                                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5699
                      ].
4340
b7b73a78385a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4339
diff changeset
  5700
    ((allTheBest := allDistances) count:[:entry | entry value]) > 20 ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5701
        allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.5)].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5702
        allTheBest size > 15 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5703
            allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.8)].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5704
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5705
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5706
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5707
    start := node start.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5708
    stop := node stop.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5709
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5710
    best := self askUserForCompletion:('Variable for "%1"' bindWith:node name)
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5711
                 for:codeView at: start
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5712
                 from:(allTheBest collect:[:assoc | assoc key]).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5713
    best isNil ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5714
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5715
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5716
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5717
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5718
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5719
    codeView
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5720
        undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5721
        info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5722
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5723
    (best startsWith:oldVar) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5724
        oldLen := stop - start + 1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5725
        newLen := best size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5726
        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5727
        codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5728
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5729
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5730
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5731
    "Modified: / 16-02-2010 / 10:13:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5732
    "Modified: / 28-08-2013 / 15:37:28 / cg"
5551
69c688e4d25b #DOCUMENTATION by mawalch
mawalch
parents: 5542
diff changeset
  5733
    "Modified (format): / 12-06-2017 / 12:37:31 / mawalch"
6022
ccbc2453e82d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6013
diff changeset
  5734
    "Modified (format): / 03-03-2019 / 22:53:58 / Claus Gittinger"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5735
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5736
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5737
!DoWhatIMeanSupport methodsFor:'code completion - obsolete'!
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5738
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5739
codeCompletionForClass:classOrNilArg context:contextOrNil codeView:codeViewArg
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5740
    <resource: #obsolete>
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5741
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5742
     contextOrNil is the current context, if this is called from the debugger;
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5743
     nil, if called from the browser.
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5744
     If nonNil, we can make better guesses, because we actually know what a variable's type is.
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5745
     This is not yet done, sigh"
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5746
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5747
    ^self codeCompletionForLanguage: nil class:classOrNilArg context:contextOrNil codeView:codeViewArg
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5748
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5749
    "Modified: / 04-07-2006 / 18:48:26 / fm"
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5750
    "Modified: / 28-08-2013 / 17:15:25 / cg"
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5751
    "Modified: / 18-09-2013 / 14:15:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5752
!
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5753
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5754
codeCompletionForMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5755
    <resource: #obsolete>
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5756
    ^ self
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5757
	codeCompletionForSmalltalkMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5758
! !
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5759
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  5760
!DoWhatIMeanSupport methodsFor:'helpers - naive type inference'!
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5761
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5762
addClassesFromAssignmentTo:varName in:aTree to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5763
    "/ assignments...
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5764
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5765
    aTree allAssignmentNodesDo:[:eachAssignmentNode |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5766
        |leftSide|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5767
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5768
        leftSide := eachAssignmentNode variable.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5769
        leftSide name = varName ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5770
            self 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5771
                addClassesOfExpression:eachAssignmentNode value 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5772
                inClass:classOrNil to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5773
        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5774
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5775
    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5776
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5777
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5778
addClassesFromMessagesSentTo:varNode in:aTree to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5779
    "/ from the set of messages sent at other places,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5780
    "/ try to find classes, which respond to all those.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5781
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5782
    |varName allSelectors candidates|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5783
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5784
    varName := varNode name.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5785
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5786
    allSelectors := IdentitySet new.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5787
    aTree allMessageNodesDo:[:eachMessageNode |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5788
        |rcvr|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5789
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5790
        rcvr := eachMessageNode receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5791
        (rcvr isVariable and:[rcvr name = varName]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5792
            allSelectors add:eachMessageNode selector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5793
        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5794
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5795
    
5324
555436a71f8d #OTHER by mawalch
mawalch
parents: 5322
diff changeset
  5796
    "/ the selector being completed must be ignored here
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5797
    (varNode parent notNil and:[varNode parent isMessage]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5798
        allSelectors remove:(varNode parent selector) ifAbsent:[].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5799
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5800
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5801
    "/ now look for classes which implement all of them
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5802
    candidates := SystemBrowser findRespondersOfAll:allSelectors in:nil ignoreCase:false.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5803
    candidates remove:Object ifAbsent:[].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5804
    setOfTypes addAll:candidates.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5805
    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5806
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5807
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5808
addClassesOfBlockVarForWellknownBlocks:variableNode inScope:blockScope to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5809
    |blockParent blockParentSelector exNode isHandler|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5810
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5811
    blockParent := blockScope parent.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5812
    (blockParent notNil and:[blockParent isMessage]) ifFalse:[^ setOfTypes].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5813
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5814
    blockParentSelector := blockParent selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5815
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5816
    "/ if the parent of the block is an enumeration message, and the receiver is known,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5817
    "/ we know the type of argument.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5818
    ( #(do: keysAndValuesDo: select: collect:) includes:blockParent selector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5819
        |collection|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5820
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5821
        collection := self valueOfNode:blockParent receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5822
        collection notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5823
            (collection isKindOf:Collection) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5824
                collection notEmpty ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5825
                    |someElement|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5826
                    someElement := collection anElement.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5827
                    setOfTypes add:someElement class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5828
                    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5829
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5830
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5831
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5832
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5833
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5834
    "/ because we type-in those so often, it is great to get
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5835
    "/ better info on the ex parameter... (and it's a low hanging fruit)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5836
    ( blockParentSelector == #handle:do: ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5837
        exNode := blockParent receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5838
        isHandler := (blockScope == (blockParent arguments at:1)).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5839
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5840
    ( blockParentSelector == #on:do: ) ifTrue:[
5133
ea59e0c6f090 #BUGFIX by Maren
matilk
parents: 5131
diff changeset
  5841
"/        self halt.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5842
        exNode := blockParent arg1.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5843
        isHandler := (blockScope == (blockParent arguments at:2)).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5844
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5845
    exNode notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5846
        |cls exClass|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5847
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5848
        ((cls := (self valueOfNode:exNode)) notNil and:[cls isBehavior]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5849
            exClass := cls
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5850
        ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5851
            exClass := Exception
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5852
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5853
        setOfTypes add:exClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5854
        ^ self
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5855
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5856
    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5857
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5858
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5859
addClassesOfExpression:expr inClass:classOrNil to:setOfPossibleClasses
5803
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5860
    |cls exprVal varName constraints|
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5861
5980
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  5862
    classResolverHook notNil ifTrue:[
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  5863
        setOfPossibleClasses addAll:((classResolverHook value:expr) ? #())
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  5864
    ].
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  5865
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5866
    (expr isVariable "and:[expr name = 'secondsOrNil']") ifTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5867
        "/ see if contained inside an isXXX ifTrue;
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5868
        "/ then, we know a lot more...
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5869
        expr parent notNil ifTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5870
            constraints := self extractConstraintsFor:expr inClass:classOrNil.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5871
            constraints notEmpty ifTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5872
                setOfPossibleClasses addAll:constraints.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5873
                ^ setOfPossibleClasses.    
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5874
            ].    
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5875
        ].
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5876
    ].
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5877
    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5878
    expr isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5879
        exprVal := expr value.
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5880
        cls := exprVal class.         
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5881
        (exprVal isArray or:[ exprVal isByteArray or:[ exprVal isString ]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5882
            exprVal isImmutable ifTrue:[
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5883
                setOfPossibleClasses add:cls mutableClass.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5884
                ^ setOfPossibleClasses.    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5885
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5886
        ].
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5887
        setOfPossibleClasses add:cls. 
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5888
        ^ setOfPossibleClasses.    
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5889
    ].
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5890
    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5891
    expr isBlock ifTrue:[
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5892
        setOfPossibleClasses add:Block. 
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5893
        ^ setOfPossibleClasses.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5894
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5895
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5896
    thisContext isRecursive ifTrue:[
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5897
        |count|
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5898
        count := 0.
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5899
        thisContext withAllSendersDo:[:c | (c selector == thisContext selector) ifTrue:[count := count + 1 ]].
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5900
        count > 10 ifTrue:[
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5901
            ^ setOfPossibleClasses
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5902
        ].
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5903
    ].
5131
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5904
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5905
    expr isVariable ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5906
        varName := expr name.
5803
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5907
        self addClassesOfVariable:varName inExpression:expr inClass:classOrNil to:setOfPossibleClasses.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5908
        ^ setOfPossibleClasses
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5909
    ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5910
    "/ we might get a degenerated / incomplete expression;
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5911
    "/ especially in a workspace, where a variable is interpreted
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5912
    "/ as a selector (when a period is missing before)
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5913
    expr isMessage ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5914
        expr selector isUnarySelector ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5915
            varName := expr selector.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5916
            self addClassesOfVariable:varName inExpression:expr inClass:classOrNil to:setOfPossibleClasses.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5917
        ].
5803
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5918
    ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  5919
    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5920
    (exprVal := self valueOfNode:expr) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5921
        "/ knowing the value is always great!!
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5922
        setOfPossibleClasses add:exprVal class.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5923
        ^ setOfPossibleClasses.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5924
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5925
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5926
    expr isMessage ifTrue:[
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5927
        self addClassesOfMessage:expr inClass:classOrNil to:setOfPossibleClasses.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5928
        ^ setOfPossibleClasses
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5929
    ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5930
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5931
    ^ setOfPossibleClasses
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5932
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5933
    "Modified: / 24-02-2017 / 14:41:00 / stefan"
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  5934
    "Modified: / 15-09-2017 / 10:52:40 / cg"
5980
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  5935
    "Modified: / 27-12-2018 / 12:16:28 / Claus Gittinger"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5936
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5937
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5938
addClassesOfInstVarNamed:varName inClass:aClass to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5939
    |instIndex type|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5940
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5941
    instIndex := aClass instVarIndexFor:varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5942
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5943
    "/ ask the class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5944
    (type := aClass typeOfInstVarNamed:varName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5945
        type isCollection ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5946
            setOfTypes addAll:type.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5947
        ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5948
            setOfTypes add:type.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5949
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5950
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5951
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5952
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5953
    "/ look for instances
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5954
    aClass allSubInstancesDo:[:i |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5955
        |varClass|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5956
        varClass := (i instVarAt:instIndex) class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5957
        setOfTypes add:varClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5958
    ].  
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5959
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5960
    "/ look for assignments in code
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5961
    aClass withAllSubclassesDo:[:eachClass |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5962
        eachClass methodDictionary do:[:m |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5963
            |tree code visitor|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5964
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5965
            "/ quick check
5125
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5966
            SourceCodeManagerError handle:[:ex |
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5967
            ] do:[    
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5968
                code := m source.
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5969
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5970
            (code notNil and:[code includesString:varName]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5971
                tree := Parser parse:code class:eachClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5972
                (tree notNil and:[tree ~~ #Error]) ifTrue:[
6134
4f82fe433898 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 6128
diff changeset
  5973
                    visitor := ParseNodeVisitor new. 
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5974
                    visitor 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5975
                        actionForNodeClass:AssignmentNode 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5976
                        put:[:node |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5977
                            |val expr exprSelector|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5978
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5979
                            node variable name = varName ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5980
                                expr := node expression.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5981
                                "/ only look for wellknown types on the right side.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5982
                                expr isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5983
                                    val := expr evaluate.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5984
                                    val isArray ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5985
                                        setOfTypes add:Array 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5986
                                    ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5987
                                        setOfTypes add:val class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5988
                                    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5989
                                ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5990
                                    expr isMessage ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5991
                                        exprSelector := expr selector. 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5992
                                        ( #(+ - * /) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5993
                                            setOfTypes add:Number
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5994
                                        ] ifFalse:[    
5621
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  5995
                                            ( #(// size basicSize position) includes:exprSelector ) ifTrue:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5996
                                                setOfTypes add:Integer
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5997
                                            ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5998
                                                ( #(copy shallowCopy) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5999
                                                ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6000
                                                    ( #(new new: basicNew basicNew:) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6001
                                                        expr receiver isGlobal ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6002
                                                            setOfTypes add:expr receiver evaluate
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6003
                                                        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6004
                                                    ] ifFalse:[    
5660
295016846707 #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 5658
diff changeset
  6005
                                                        self breakPoint:#DWIM.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6006
                                                    ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6007
                                                ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6008
                                            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6009
                                        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6010
                                    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6011
                                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6012
                            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6013
                            true "/ yes - visit subnodes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6014
                        ].        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6015
                    visitor visit:tree.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6016
                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6017
            ]    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6018
        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6019
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6020
    ^ setOfTypes
5621
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  6021
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  6022
    "Modified: / 11-10-2017 / 13:58:36 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6023
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6024
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6025
addClassesOfMessage:expr inClass:classOrNil to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6026
    |valClass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6027
     msgSelector msgReceiver msgArg1
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6028
     receiverClasses receiverClass 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6029
     arg1Classes arg1Value mthd|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6030
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6031
    msgSelector := expr selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6032
         
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6033
    "/ heuristic: quickly assume boolean for some:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6034
    (
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6035
        #( 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6036
            isNil notNil isEmpty isEmptyOrNil notEmpty notEmptyOrNil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6037
            > >= < <= = == ~ ~=
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6038
            knownAsSymbol
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6039
            isMeta 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6040
            includes: contains:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6041
            not and: or:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6042
            exists atEnd positive negative odd even
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6043
        ) includes:msgSelector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6044
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6045
        setOfTypes add:True.  "/ use True, because Boolean does not include the full protocol
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6046
        ^ setOfTypes    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6047
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6048
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6049
    msgReceiver := expr receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6050
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6051
    "/ some hardwired knowledge here
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6052
    receiverClasses := self classesOfNode:msgReceiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6053
    receiverClass := receiverClasses size == 1 ifTrue:[receiverClasses anElement] ifFalse:[nil].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6054
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6055
    receiverClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6056
        "/ follow Smalltalk at: to see what is there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6057
        receiverClass == Smalltalk ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6058
            msgSelector == #at: ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6059
                msgArg1 := expr arg1.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6060
                msgArg1 isLiteralSymbol ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6061
                    arg1Value := Smalltalk at:msgArg1 value.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6062
                    arg1Value notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6063
                        setOfTypes add:arg1Value class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6064
                        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6065
                    ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6066
                ]    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6067
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6068
        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6069
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6070
        "/ usually return something of the receiver's type
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6071
        ( #(copy shallowCopy copyWith: , ) includes:msgSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6072
            setOfTypes addAll:receiverClasses.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6073
            ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6074
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6075
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6076
        ( msgSelector == #class ) ifTrue:[  
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6077
            setOfTypes add:(receiverClass class).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6078
            ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6079
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6080
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6081
        receiverClass isBehavior ifTrue:[                        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6082
            ( #(compiledMethodAt:) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6083
                setOfTypes add:Method.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6084
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6085
            ].            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6086
            ( #(superclass) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6087
                receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6088
                    setOfTypes add:Metaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6089
                ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6090
                    setOfTypes add:Class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6091
                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6092
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6093
            ].            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6094
            ( #(theNonMetaclass theMetaclass) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6095
                receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6096
                    setOfTypes add:Metaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6097
                    ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6098
                ].
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  6099
                setOfTypes add:(receiverClass perform:msgSelector asSymbol) class.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6100
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6101
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6102
            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6103
            mthd := receiverClass lookupMethodFor:msgSelector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6104
            receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6105
                ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: msgSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6106
                    setOfTypes add:receiverClass theNonMetaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6107
                    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6108
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6109
                "/ if that method sends one of new/basicNew/new:/basicNew:, assume it returns an instance of itself
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6110
                mthd notNil ifTrue:[
5451
32ed77c9d198 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5419
diff changeset
  6111
                    ( mthd sendsAnySelector:#( #'new' #'basicNew' #'new:' #'basicNew:' )) ifTrue:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6112
                        setOfTypes add:receiverClass theNonMetaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6113
                        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6114
                    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6115
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6116
            ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6117
                mthd notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6118
                    (ParseTreeSearcher methodIsSetterMethod:mthd) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6119
                        setOfTypes add:receiverClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6120
                        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6121
                    ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6122
                ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6123
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6124
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6125
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6126
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6127
    ((msgSelector startsWith:'as')
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6128
    and:[ (valClass := Smalltalk classNamed:(msgSelector copyFrom:3)) notNil ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6129
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6130
        setOfTypes add:valClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6131
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6132
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6133
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6134
    ((msgSelector startsWith:'is')
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6135
    and:[ (valClass := Smalltalk classNamed:(msgSelector copyFrom:3)) notNil ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6136
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6137
        setOfTypes add:True. "/ True - not boolean; it does not contain the full protocol (would not find ifTrue:)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6138
        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6139
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6140
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6141
    #(
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6142
        size                    SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6143
        hash                    SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6144
        identityHash            SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6145
        class                   Class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6146
        theMetaclass            Metaclass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6147
        theNonMetaclass         Class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6148
        fork                    Process
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6149
        newProcess              Process
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6150
    ) pairWiseDo:[:sel :clsName |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6151
        msgSelector == sel ifTrue:[ 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6152
            setOfTypes add:(Smalltalk at:clsName).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6153
            ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6154
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6155
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6156
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6157
    ( #( bitAnd: bitOr: bitShift: rightShift: >> << highBit lowBit ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6158
        "/ assume integer
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6159
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6160
        setOfTypes add:Integer.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6161
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6162
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6163
    ( #( + - * // \\ ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6164
        "/ assume numeric
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6165
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6166
        setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6167
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6168
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6169
    msgSelector == #/ ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6170
        ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Number]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6171
            setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6172
            ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6173
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6174
        msgArg1 := expr arguments at:1 ifAbsent:nil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6175
        msgArg1 isNil ifTrue:[^ setOfTypes].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6176
        arg1Classes := ((self classesOfNode:msgArg1) ? #()).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6177
        (arg1Classes contains:[:cls | cls includesBehavior:Number]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6178
            setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6179
            ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6180
        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6181
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6182
    ( #( construct: / ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6183
        ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Filename]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6184
            setOfTypes add:Filename.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6185
            ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6186
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6187
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6188
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6189
    ^ setOfTypes
5451
32ed77c9d198 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5419
diff changeset
  6190
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  6191
    "Modified: / 10-02-2017 / 10:39:41 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6192
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6193
5803
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6194
addClassesOfVariable:varName inExpression:expr inClass:classOrNil to:setOfPossibleClasses
5804
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6195
    "expr is either a variable-node or a message in which varName is the selector"
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6196
    
5803
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6197
    |varScope instVarClass classVarClass privateClass poolVarClass 
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6198
     sym topNameSpace exprVal|
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6199
    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6200
    varName = 'self' ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6201
        instanceOrNil notNil ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6202
            setOfPossibleClasses add:(instanceOrNil class).
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6203
        ] ifFalse:[    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6204
            setOfPossibleClasses add:(classOrNil ? UndefinedObject).
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6205
        ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6206
        ^ setOfPossibleClasses
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6207
    ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6208
    varName = 'super' ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6209
        classOrNil isNil 
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6210
            ifTrue:[setOfPossibleClasses add:Object]
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6211
            ifFalse:[setOfPossibleClasses add:classOrNil superclass].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6212
        ^ setOfPossibleClasses.    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6213
    ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6214
    varName = 'thisContext' ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6215
        setOfPossibleClasses add:Context.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6216
        ^ setOfPossibleClasses
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6217
    ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6218
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6219
    varScope := expr whoDefines: varName.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6220
    (varScope notNil) ifTrue:[
5804
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6221
        expr isVariable ifTrue:[
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6222
            varScope isSequence ifTrue:[
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6223
                varScope := varScope parent.
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6224
            ].
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6225
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6226
            (varScope isBlock) ifTrue:[
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6227
                self addClassesOfBlockVarForWellknownBlocks:expr inScope:varScope to:setOfPossibleClasses.
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6228
                self addClassesFromAssignmentTo:varName in:varScope to:setOfPossibleClasses.
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6229
                self addClassesFromMessagesSentTo:expr in:varScope to:setOfPossibleClasses.
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6230
                ^ setOfPossibleClasses
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6231
            ].    
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6232
            (varScope isMethod) ifTrue:[
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6233
                self addClassesFromAssignmentTo:varName in:varScope to:setOfPossibleClasses.
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6234
                self addClassesFromMessagesSentTo:expr in:varScope to:setOfPossibleClasses.
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6235
                ^ setOfPossibleClasses
aa470687012f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5803
diff changeset
  6236
            ].    
5803
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6237
        ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6238
    ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6239
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6240
    classOrNil notNil ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6241
        "/ inst var
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6242
        instVarClass := classOrNil whichClassDefinesInstVar:varName.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6243
        instVarClass notNil ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6244
            setOfPossibleClasses addAll:(self classesOfInstVarNamed:varName inClass:instVarClass).
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6245
            ^ setOfPossibleClasses
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6246
        ].    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6247
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6248
        "/ class vars
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6249
        classVarClass := classOrNil theNonMetaclass whichClassDefinesClassVar:varName.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6250
        classVarClass notNil ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6251
            "/ see what is currently there
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6252
            setOfPossibleClasses add:(classVarClass classVarAt:varName asSymbol) class.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6253
            ^ setOfPossibleClasses
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6254
        ].    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6255
        varName isUppercaseFirst ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6256
            "/ private class
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6257
            varName knownAsSymbol ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6258
                privateClass := classOrNil theNonMetaclass privateClassesAt:varName asSymbol.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6259
                privateClass notNil ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6260
                    setOfPossibleClasses add:(privateClass theMetaclass).
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6261
                    ^ setOfPossibleClasses
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6262
                ].    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6263
            ].    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6264
        ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6265
        "/ pool vars
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6266
        poolVarClass := classOrNil theNonMetaclass whichPoolDefinesPoolVar:varName.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6267
        poolVarClass notNil ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6268
            "/ see what is currently there
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6269
            setOfPossibleClasses add:(poolVarClass classVarAt:varName asSymbol) class.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6270
            ^ setOfPossibleClasses
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6271
        ].    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6272
    ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6273
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6274
    varName isUppercaseFirst ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6275
        sym := varName asSymbolIfInterned.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6276
        sym notNil ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6277
            (classOrNil isNil or:[(topNameSpace := classOrNil topNameSpace) isNil]) ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6278
                topNameSpace := Smalltalk.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6279
            ].
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6280
            exprVal := topNameSpace at:sym.
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6281
            exprVal notNil ifTrue:[
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6282
                setOfPossibleClasses add:(exprVal class).
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6283
            ].
6036
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  6284
            topNameSpace ~~ Smalltalk ifTrue:[
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  6285
                exprVal := Smalltalk at:sym.
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  6286
                exprVal notNil ifTrue:[
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  6287
                    setOfPossibleClasses add:(exprVal class).
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  6288
                ].
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  6289
            ].
5803
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6290
        ].        
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6291
    ].    
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6292
    ^ setOfPossibleClasses
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6293
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6294
    "Created: / 13-06-2018 / 10:17:42 / Claus Gittinger"
6036
171e12f06b70 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 6022
diff changeset
  6295
    "Modified: / 18-03-2019 / 11:28:39 / Claus Gittinger"
5803
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6296
!
c46ed8974a7c #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5784
diff changeset
  6297
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6298
classOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6299
    "returns the class of a receiver, if it is well-known.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6300
     Otherwise nil (either unknown, or multiple possibilities)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6301
     When showing possible completions for a message,
5621
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  6302
     it is a good idea to know what the receiver is."
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6303
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6304
    | classes |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6305
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6306
    classes := self classesOfNode:aNode.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6307
    classes size == 1 ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6308
        ^ classes anElement
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6309
    ].
5621
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  6310
    "/ self breakPoint:#cg.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6311
    ^ nil
5621
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  6312
bc187db92ab4 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5613
diff changeset
  6313
    "Modified: / 10-10-2017 / 16:56:43 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6314
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6315
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6316
classesFromAssignmentTo:varName in:aTree
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6317
    ^ self addClassesFromAssignmentTo:varName in:aTree to:IdentitySet new
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6318
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6319
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6320
classesOfInstVarNamed:varName inClass:aClass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6321
    ^ self addClassesOfInstVarNamed:varName inClass:aClass to:(IdentitySet new)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6322
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6323
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6324
classesOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6325
    "returns the set of possible classes of a parsenode.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6326
     or nil if unknown.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6327
     When showing possible completions for a message,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6328
     it is a good idea to know what the kind receiver is."
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6329
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6330
    |setOfPossibleClasses|
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6331
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6332
    setOfPossibleClasses := IdentitySet new.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6333
    self addClassesOfExpression:aNode inClass:classOrNil to:setOfPossibleClasses.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6334
    ^ setOfPossibleClasses.
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6335
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6336
    "Modified: / 05-02-2017 / 12:40:16 / cg"
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6337
    "Modified (format): / 15-09-2017 / 10:11:19 / cg"
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6338
!
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6339
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6340
extractConstraintsFor:expr inClass:dummyClassOrNil
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6341
    "see if expr is contained inside an isXXX ifTrue:[...]
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6342
     then, we know a lot more...
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6343
     For example, to expand possible messages for XXX in:
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6344
        foo isString ifTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6345
            f XXX
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6346
        ].
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6347
     we now have to care for instances for which isString returns true only"   
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6348
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6349
    |node parentNode possibleClasses allImplementors condition classesReturningTrue classesReturningFalse|
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6350
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6351
    possibleClasses := Set new.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6352
    
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6353
    node := expr.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6354
    [
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6355
        parentNode := node parent.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6356
        parentNode isNil ifTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6357
            "/ due to the partial parse (being right in the middle of a parse),
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6358
            "/ the parent may be undefined (for example, if closing bracket of a block was not yet entered)
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6359
            "/ then the parse stopped and we have the partial parent message in the rememberedNodes list.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6360
            "/ try there; if found, continue there. If not, well, we might be really at the top.
5608
585c8f740aea #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5607
diff changeset
  6361
            rememberedNodes notNil ifTrue:[
585c8f740aea #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5607
diff changeset
  6362
                rememberedNodes do:[:eachPossibleParentNode |
5609
8a30b1f720d7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5608
diff changeset
  6363
                    (eachPossibleParentNode stop notNil and:[ node start notNil ]) ifTrue:[
5608
585c8f740aea #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5607
diff changeset
  6364
                        eachPossibleParentNode stop <= node start ifTrue:[
585c8f740aea #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5607
diff changeset
  6365
                            (parentNode isNil or:[parentNode stop < eachPossibleParentNode stop]) ifTrue:[
585c8f740aea #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5607
diff changeset
  6366
                                parentNode := eachPossibleParentNode
585c8f740aea #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5607
diff changeset
  6367
                            ].    
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6368
                        ].    
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6369
                    ].    
5608
585c8f740aea #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5607
diff changeset
  6370
                ].
5612
e77a2fa2031f #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5609
diff changeset
  6371
                parentNode notNil ifTrue:[ rememberedNodes removeIdentical:parentNode ].
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6372
            ].
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6373
        ].    
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6374
        parentNode notNil
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6375
    ] whileTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6376
        (parentNode isMessage 
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6377
            and:[#(ifTrue:) includes:parentNode selector])
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6378
        ifTrue:[ 
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6379
            (condition := parentNode receiver) isMessage ifTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6380
                condition receiver isVariable ifTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6381
                    condition receiver name = expr name ifTrue:[
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6382
                        "/ here, we have an if, sending some message to the same receiver variable
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6383
                        allImplementors := Smalltalk allImplementorsOf:condition selector.
5633
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6384
                        SourceCodeManagerError handle:[:ex |
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6385
                        ] do:[
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6386
                            classesReturningTrue := 
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6387
                                allImplementors select:[:cls | 
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6388
                                                    |mthd|
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6389
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6390
                                                    mthd := cls compiledMethodAt:condition selector.
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6391
                                                    ParseTreeSearcher methodIsJustReturningTrue:mthd.
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6392
                                                ].
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6393
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6394
                            classesReturningTrue do:[:eachClass |
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6395
                                eachClass withAllSubclassesDo:[:eachSubClass |
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6396
                                    possibleClasses add:eachSubClass
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6397
                                ].
5606
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6398
                            ].
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6399
                        ].
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6400
                        ^ possibleClasses.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6401
                    ].        
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6402
                ].        
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6403
            ].    
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6404
        ].
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6405
        node := parentNode.
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6406
    ].    
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6407
    ^ possibleClasses
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6408
28585ddb3a51 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5598
diff changeset
  6409
    "Created: / 15-09-2017 / 10:16:20 / cg"
5633
f888f84e67f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5621
diff changeset
  6410
    "Modified: / 05-11-2017 / 02:59:59 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6411
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6412
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6413
isNonDestructive:aMessageNode whenSentTo:receiverValue
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6414
    "return true, if it is safe to send aSelector to receiverValue
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6415
     (i.e. has no side effects)"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6416
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6417
    |selector method impl arg1Value|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6418
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6419
    selector := aMessageNode selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6420
    impl := receiverValue class whichClassIncludesSelector:selector.
5706
6aa652210ae2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5687
diff changeset
  6421
    impl isNil ifTrue:[
6aa652210ae2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5687
diff changeset
  6422
        ^ false "/ don't know - but assume it is dangerous
6aa652210ae2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5687
diff changeset
  6423
    ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6424
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6425
    ( #( 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6426
        basicSize basicAt:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6427
        class theMetaclass theNonMetaclass ) includes:selector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6428
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6429
        ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6430
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6431
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6432
    selector == #size ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6433
        "/ mhm - be conservative; someone might have redefined #size
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6434
        "/ more hardwired stuff.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6435
        ((impl == Object) or:[(impl == String) or:[impl isSubclassOf:Collection]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6436
            ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6437
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6438
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6439
    selector == #at: ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6440
        "/ mhm - be conservative; someone might have redefined #at: and do something there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6441
        "/ more hardwired stuff.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6442
        arg1Value := self valueOfNode:(aMessageNode arg1).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6443
        arg1Value notNil ifTrue:[            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6444
            receiverValue == Smalltalk ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6445
                ^ arg1Value isSymbol
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6446
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6447
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6448
            ((impl == Object) or:[(impl == String) or:[(impl isSubclassOf:Collection)]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6449
                ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6450
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6451
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6452
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6453
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6454
    selector argumentCount == 0 ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6455
        "/ follow non-destructive accessors
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6456
        method := receiverValue class lookupMethodFor:selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6457
        method notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6458
            (ParseTreeSearcher methodIsJustReturningSomething:method) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6459
                "/ we can savely call that method to get the current value
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6460
                ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6461
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6462
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6463
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6464
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6465
    ^ false
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6466
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6467
    "Modified: / 09-03-2017 / 10:58:50 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6468
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6469
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6470
valueAndKindOfVariable:aVariableName
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6471
    "when showing possible completions for a variable,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6472
     it is a good idea to know what the reveiver's value is.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6473
     Sigh - returns nil as value both if unknown AND if a real nil is there"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6474
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6475
    |nodeVal con classInstVarClass classVarClass privateClass pool sym nameSpace topNameSpace|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6476
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6477
    aVariableName isUppercaseFirst ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6478
        classOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6479
            classOrNil isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6480
                "/ class instVars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6481
                (classInstVarClass := classOrNil whichClassDefinesInstVar:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6482
                    nodeVal := classInstVarClass theNonMetaclass instVarNamed:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6483
                    ^ { nodeVal . #classInstVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6484
                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6485
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6486
            "/ class vars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6487
            (classVarClass := classOrNil theNonMetaclass whichClassDefinesClassVar:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6488
                nodeVal := classVarClass classVarAt:aVariableName asSymbol.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6489
                ^ { nodeVal . #classVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6490
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6491
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6492
            privateClass := classOrNil theNonMetaclass privateClasses detect:[:cls | cls nameWithoutPrefix = aVariableName] ifNone:nil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6493
            privateClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6494
                nodeVal := privateClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6495
                ^ { nodeVal . #privateClass }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6496
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6497
            pool := classOrNil theNonMetaclass whichPoolDefinesPoolVar:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6498
            pool notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6499
                nodeVal := pool classVarAt:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6500
                ^ { nodeVal . #poolVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6501
            ].
5118
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6502
            (sym := aVariableName asSymbolIfInterned) notNil ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6503
                ((nameSpace := classOrNil nameSpace) notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6504
                    nameSpace isNameSpace ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6505
                        nodeVal := nameSpace at:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6506
                        (nodeVal notNil or:[nameSpace includesKey:sym]) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6507
                            ^ { nodeVal . #nameSpaceVariable }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6508
                        ].
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6509
                    ].
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6510
                    nodeVal := nameSpace privateClassNamed:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6511
                    (nodeVal notNil) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6512
                        ^ { nodeVal . #privateClass }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6513
                    ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6514
                ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6515
                ((topNameSpace := classOrNil topNameSpace) notNil 
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6516
                and:[topNameSpace ~~ nameSpace
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6517
                and:[topNameSpace ~~ Smalltalk]]) ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6518
                    nodeVal := topNameSpace at:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6519
                    (nodeVal notNil or:[topNameSpace includesKey:sym]) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6520
                        ^ { nodeVal . #nameSpaceVariable }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6521
                    ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6522
                ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6523
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6524
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6525
        (sym := aVariableName asSymbolIfInterned) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6526
            nodeVal := Smalltalk at:sym.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6527
            (nodeVal notNil or:[Smalltalk includesKey:sym]) ifTrue:[     
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6528
                ^ { nodeVal . #global }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6529
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6530
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6531
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6532
        "/ 'evaluate' the variable (like in a browser's codeView)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6533
        "/ mhmh - will we catch workspace vars then?
5118
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6534
        Error ignoreIn:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6535
            nodeVal := Parser new evaluate:aVariableName in:classOrNil receiver:classOrNil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6536
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6537
        nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6538
            ^ { nodeVal . #global }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6539
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6540
        ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6541
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6542
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6543
    aVariableName = 'self' ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6544
        contextOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6545
            ^ { contextOrNil receiver . #pseudoVar } 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6546
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6547
        (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6548
            "/ ^ { classOrNil . #pseudoVar }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6549
            ^ { classOrNil theNonMetaclass . #pseudoVar }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6550
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6551
        ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6552
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6553
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6554
    contextOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6555
        "/ in the debugger, we know more
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6556
        con := contextOrNil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6557
        [ con notNil ] whileTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6558
            "/ a local in the context?
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6559
            ((con argAndVarNames ? #()) includes:aVariableName) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6560
                nodeVal := con argsAndVars at:(con argAndVarNames indexOf:aVariableName) ifAbsent:nil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6561
                nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6562
                    ^ { nodeVal . #argument }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6563
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6564
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6565
            con := con home.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6566
        ].
5370
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6567
        "/ an instvar?
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6568
        (contextOrNil receiver class allInstVarNames includes:aVariableName) ifTrue:[
5370
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6569
            contextOrNil receiver isProtoObject ifFalse:[
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6570
                nodeVal := contextOrNil receiver instVarNamed:aVariableName.
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6571
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6572
            nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6573
                ^ { nodeVal . #instanceVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6574
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6575
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6576
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6577
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6578
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6579
    "Created: / 01-05-2016 / 12:40:05 / cg"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6580
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6581
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6582
valueOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6583
    "when showing possible completions for a message,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6584
     it is a good idea to know what the reveiver's value is.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6585
     Sigh - returns nil both if unknown AND if a real nil is there."
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6586
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6587
    |nodeSelector nodeReceiver receiverValue arg1Value|
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6588
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6589
    aNode isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6590
        ^ aNode value
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6591
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6592
    aNode isVariable ifTrue:[
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6593
        aNode isSelf ifTrue:[
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6594
            instanceOrNil notNil ifTrue:[
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6595
                ^ instanceOrNil
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6596
            ].    
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6597
        ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6598
        ^ self valueOfVariable:aNode name.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6599
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6600
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6601
    aNode isMessage ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6602
        nodeSelector := aNode selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6603
        nodeReceiver := aNode receiver.
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6604
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6605
        "/ some hardwired knowledge here
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6606
        classOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6607
            (nodeReceiver isSelf and:[nodeSelector = #'class']) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6608
                ^ classOrNil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6609
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6610
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6611
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6612
        receiverValue := self valueOfNode:nodeReceiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6613
        receiverValue notNil ifTrue:[
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6614
            (self isNonDestructive:aNode whenSentTo:receiverValue) ifTrue:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6615
                [
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6616
                     nodeSelector argumentCount == 1 ifTrue:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6617
                        arg1Value := self valueOfNode:(aNode arg1).
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6618
                        ^ receiverValue perform: nodeSelector with: arg1Value.
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6619
                    ].    
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6620
                    ^ receiverValue perform: nodeSelector.
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6621
                ] on:Error do:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6622
                    ^ nil
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6623
                ]    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6624
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6625
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6626
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6627
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6628
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6629
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6630
    "Created: / 28-08-2013 / 16:34:53 / cg"
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6631
    "Modified: / 09-03-2017 / 10:58:42 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6632
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6633
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6634
valueOfVariable:aVariableName
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6635
    "when showing possible completions for a variable,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6636
     it is a good idea to know what the reveiver's value is.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6637
     Sigh - returns nil both if unknown AND if a real nil is there."
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6638
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6639
    |valueAndKind|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6640
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6641
    (valueAndKind := self valueAndKindOfVariable:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6642
        self assert:valueAndKind isArray.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6643
        ^ valueAndKind first.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6644
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6645
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6646
5225
8bcca5a042c5 #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 5224
diff changeset
  6647
    "Modified: / 26-08-2016 / 14:16:16 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6648
! !
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6649
5980
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6650
!DoWhatIMeanSupport methodsFor:'setup'!
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6651
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6652
classResolverHook:aBlock
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6653
    "additional hook to allow for special class resolving.
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6654
     If non-nil, this hook is called for expression nodes,
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6655
     and may return a class or nil.
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6656
     Used eg. with expecco to resolve pin types"
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6657
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6658
    classResolverHook := aBlock
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6659
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6660
    "
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6661
     self new classResolverHook:[:expr |
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6662
         (expr isVariable and:[expr name = 'foo']) ifTrue:[
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6663
             { String }
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6664
         ] ifFalse:[
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6665
             nil
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6666
         ]
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6667
     ].
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6668
     
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6669
    "
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6670
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6671
    "Created: / 27-12-2018 / 12:11:31 / Claus Gittinger"
6105
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  6672
!
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  6673
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  6674
language:aProgrammingLanguage
82efed08b020 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 6082
diff changeset
  6675
    languageOrNil := aProgrammingLanguage
5980
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6676
! !
0ae8756ef72f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5973
diff changeset
  6677
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6678
!DoWhatIMeanSupport::InputCompletionResult class methodsFor:'instance creation'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6679
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6680
bestName:bestNameArg matchingNames:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6681
    ^ self with:bestNameArg with:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6682
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6683
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6684
     self bestName:123 matchingNames:345
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6685
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6686
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6687
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6688
!DoWhatIMeanSupport::InputCompletionResult methodsFor:'accessing'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6689
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6690
bestName
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6691
    ^ self at:1
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6692
!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6693
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6694
matchingNames
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6695
    ^ self at:2
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6696
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6697
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6698
!DoWhatIMeanSupport class methodsFor:'documentation'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6699
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6700
version
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  6701
    ^ '$Header$'
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6702
!
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6703
3761
6584390d427d dont forget pool variables when looking for the best variable match
Claus Gittinger <cg@exept.de>
parents: 3751
diff changeset
  6704
version_CVS
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  6705
    ^ '$Header$'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6706
! !
4194
e677aae984be Refactoring:
Stefan Vogel <sv@exept.de>
parents: 4148
diff changeset
  6707