DoWhatIMeanSupport.st
author mawalch
Wed, 17 May 2017 12:14:44 +0200
changeset 5542 27dfb346d0cb
parent 5539 04879fedd753
child 5551 69c688e4d25b
permissions -rw-r--r--
#DOCUMENTATION by mawalch class: DoWhatIMeanSupport comment/format in: #codeCompletionForLiteralSymbol:element:considerAll: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
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
    19
		codeAspect'
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
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    69
!DoWhatIMeanSupport class methodsFor:'code completion'!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    70
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    71
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
    72
    "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
    73
     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
    74
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    75
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    76
     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
    77
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    78
    ^ self new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    79
        codeCompletionFor: aspect
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    80
        language: languageOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    81
        method:methodOrNil orClass:classOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    82
        context:contextOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    83
        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
    84
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    85
    "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
    86
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    87
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
    88
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
    89
    "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
    90
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    91
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    92
     because we actually know what a variable's type is."
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
    93
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    94
    ^ self new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    95
        codeCompletionForLanguage: languageOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    96
        class:classOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    97
        context:contextOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    98
        codeView:codeView
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
    99
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   100
    "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
   101
! !
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   102
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   103
!DoWhatIMeanSupport class methodsFor:'code completion - obsolete'!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   104
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   105
codeCompletionForClass:classOrNil context:contextOrNil codeView:codeView
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   106
    <resource: #obsolete>
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   107
    "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
   108
     nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   109
     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
   110
     This is not yet done, sigh"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   111
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   112
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   113
	codeCompletionForLanguage: nil class:classOrNil context:contextOrNil codeView:codeView
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   114
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   115
    "Modified: / 18-09-2013 / 13:34:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   116
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   117
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   118
codeCompletionForMethod:methodOrNil orClass:classOrNil context:contextOrNil codeView:codeView into:actionBlock
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   119
    <resource: #obsolete>
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   120
    "contextOrNil is the current context, if this is called from the debugger;
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   121
     nil, if called from the browser.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   122
     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
   123
     This is not yet done, sigh"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   124
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   125
    ^ self new
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   126
	codeCompletionForMethod:methodOrNil orClass:classOrNil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   127
	context:contextOrNil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   128
	codeView:codeView into:actionBlock
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   129
! !
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   130
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   131
!DoWhatIMeanSupport class methodsFor:'code completion-helpers'!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   132
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   133
findNodeForInterval:interval in:source
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   134
    "utility"
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   135
    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   136
    |tree node remember|
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   137
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   138
    interval isEmpty ifTrue: [^ nil].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   139
    RBParser isNil ifTrue: [^ nil].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   140
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   141
    source = LastSource ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   142
        tree := LastParseTree.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   143
    ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   144
        remember := true.    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   145
        LastSource := LastParseTree := nil.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   146
        tree := RBParser
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   147
                parseMethod:source
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   148
                onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   149
                    [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   150
                        "/ Transcript showCR:'Parse-Error: ',str.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   151
                        nil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   152
                    ].
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 isNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   155
            "/ try to parse as an expression
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   156
            tree := RBParser
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   157
                    parseExpression:source
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   158
                    onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   159
                        [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   160
                            "Transcript showCR:'Parse-Error: ',str."
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   161
                            nil
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
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   164
            tree isNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   165
                "/ try to parse the selected text alone as expression
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   166
                remember := false.    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   167
                tree := RBParser
5274
fd14014f5fba #BUGFIX by Maren
matilk
parents: 5272
diff changeset
   168
                    parseExpression:(source copyFrom:interval start to:(interval stop min:source size))
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   169
                    onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   170
                        [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   171
                            "Transcript showCR:'Parse-Error: ',str."
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   172
                            nil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   173
                        ].         
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   174
                ^ tree
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   175
            ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   176
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   177
        remember ifTrue:[ 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   178
            LastSource := source.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   179
            LastParseTree := tree.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   180
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   181
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   182
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   183
    Error handle:[:ex |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   184
    ] do:[ 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   185
        node := tree whichNodeIsContainedBy:interval.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   186
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   187
    node isNil ifTrue: [
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   188
        node := tree bestNodeFor: interval.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   189
        node isNil ifTrue: [
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   190
            node := self findNodeIn:tree forInterval:interval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   191
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   192
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   193
    ^ node
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   194
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   195
    "Modified: / 06-07-2011 / 12:42:53 / cg"
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   196
!
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   197
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   198
findNodeForInterval:interval in:source allowErrors:allowErrors
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   199
    ^ self new findNodeForInterval:interval in:source allowErrors:allowErrors
4080
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   200
!
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   201
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   202
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   203
    "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
   204
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   205
    ^ self new
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   206
	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
   207
!
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   208
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   209
findNodeForInterval:interval inParseTree:parseTree
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   210
    ^ 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
   211
!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   212
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   213
findNodeIn:aTree forInterval:anInterval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   214
    "utility"
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   215
    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   216
    |nodeFound wouldReturn|
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   217
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   218
    anInterval isEmpty ifTrue:[^nil].
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
    nodeFound := nil.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   221
    aTree nodesDo:[:eachNode |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   222
        (eachNode intersectsInterval:anInterval) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   223
            (nodeFound isNil or:[nodeFound == eachNode parent]) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   224
                nodeFound := eachNode
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   225
            ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   226
                (nodeFound parent == eachNode parent
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   227
                and:[ eachNode start >= nodeFound start
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   228
                      and:[ eachNode stop <= nodeFound stop ] ]) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   229
                ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   230
                    (nodeFound parent notNil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   231
                    and:[nodeFound parent isCascade and:[eachNode parent isCascade]]) ifFalse:[^ nil]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   232
                ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   233
            ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   234
        ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   235
            nodeFound notNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   236
                "/ already found one - beyond that one; leave
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   237
                wouldReturn notNil ifTrue:[wouldReturn := nodeFound].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   238
            ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   239
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   240
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   241
"/ (wouldReturn notNil and:[wouldReturn ~~ node]) ifTrue:[self halt].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   242
    ^ nodeFound
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   243
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   244
    "Modified: / 20-11-2006 / 12:31:12 / cg"
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   247
!DoWhatIMeanSupport class methodsFor:'input completion support'!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   248
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   249
classCategoryCompletion:aPartialCategory inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   250
    "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
   251
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   252
		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
   253
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   254
    |matches best lcName|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   255
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   256
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   257
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   258
    "/ search for exact match
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   259
    anEnvironment allClassesDo:[:aClass |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   260
	|category|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   261
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   262
	category := aClass category.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   263
	(category notNil and:[category startsWith:aPartialCategory]) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   264
	    matches add:category
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   265
	]
2661
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
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   268
	"/ search for case-ignoring match
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   269
	lcName := aPartialCategory asLowercase.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   270
	anEnvironment allClassesDo:[:aClass |
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   271
	    |category|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   272
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   273
	    category := aClass category.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   274
	    (category notNil and:[category asLowercase startsWith:lcName]) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   275
		matches add:category
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   276
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   277
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   278
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   279
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   280
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   281
	^ 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
   282
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   283
    matches size == 1 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   284
	^ 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
   285
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   286
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   287
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   288
    ^ 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
   289
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   290
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   291
     Smalltalk classCategoryCompletion:'Sys'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   292
     Smalltalk classCategoryCompletion:'System'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   293
     Smalltalk classCategoryCompletion:'System-BinaryStorage'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   294
    "
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   295
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   296
    "Created: / 10-08-2006 / 13:06:45 / cg"
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   297
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   298
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   299
classNameEntryCompletionBlock
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   300
    "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
   301
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   302
    ^ self entryCompletionBlockFor:#'classnameCompletion:inEnvironment:'
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   303
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   304
    "Modified: / 10-08-2006 / 13:22:02 / cg"
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   305
!
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   306
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   307
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
   308
    "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
   309
     2 entries: 1st: the best (longest) match
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   310
                2nd: collection consisting of matching names"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   311
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   312
    |searchName matches matchedNamesWithoutPrefix ignCaseMatches best isMatchString cls nsPrefix
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   313
     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
   314
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   315
    (words := aPartialClassName asCollectionOfWords) size > 1 ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   316
        w1 := words first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   317
        w2 := words second.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   318
        rslt := self classnameCompletion:w1 filter:filterBlock inEnvironment:anEnvironment.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   319
        bestMatch := rslt first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   320
        matches := rslt second.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   321
        ('class' copyTo:(w2 size min:5)) = w2 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   322
            matches := matches collect:[:m | m , ' class'].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   323
            bestMatch := bestMatch , ' class'.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   324
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   325
        ^ InputCompletionResult bestName:bestMatch matchingNames:matches
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   326
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   327
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   328
    (aPartialClassName startsWith:'Smalltalk::') ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   329
        nsPrefix := 'Smalltalk::'.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   330
        searchName := aPartialClassName withoutPrefix:'Smalltalk::'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   331
    ] ifFalse:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   332
        nsPrefix := ''.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   333
        searchName := aPartialClassName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   334
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   335
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   336
    searchName := searchName asUppercaseFirst.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   337
    lcSearchName := searchName asLowercase.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   338
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   339
    isMatchString := searchName includesMatchCharacters.
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   340
    (searchName size > 2 
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   341
        and:[ searchName first = $* 
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   342
        and:[ searchName last = $* ]]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   343
    ) ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   344
        isMatchString := false.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   345
        searchName := searchName unquote:$*.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   346
    ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   347
    
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   348
    searchName isEmpty ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   349
        matches := Smalltalk allClassesForWhich:filterBlock.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   350
        ^ InputCompletionResult bestName:searchName matchingNames:#()
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   351
    ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   352
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   353
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   354
    matchedNamesWithoutPrefix := Set new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   355
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   356
    others := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   357
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   358
    tryToMatch :=
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   359
        [:className :fullClassName|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   360
            |addIt|
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
            isMatchString ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   363
                addIt := searchName match:className
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   364
            ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   365
                addIt := className includesString:searchName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   366
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   367
            addIt ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   368
                matches add:(nsPrefix , fullClassName).
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   369
                matchedNamesWithoutPrefix add:className.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   370
            ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   371
                "/ try ignoring case
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   372
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   373
                isMatchString ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   374
                    addIt := searchName match:className caseSensitive:false
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   375
                ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   376
                    addIt := className includesString:lcSearchName caseSensitive:false.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   377
                    addIt ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   378
                        others add:className
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   379
                    ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   380
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   381
                addIt ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   382
                    ignCaseMatches add:(nsPrefix , fullClassName).
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   383
                    matchedNamesWithoutPrefix add:className.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   384
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   385
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   386
            addIt
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   387
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   388
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   389
    anEnvironment allClassesForWhich:filterBlock do:[:aClass |
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   390
        |addIt fullClassName classNameWithoutPrefix|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   391
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   392
        aClass isMeta ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   393
            fullClassName := aClass name.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   394
            classNameWithoutPrefix := aClass nameWithoutPrefix.
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 := tryToMatch value:fullClassName value:fullClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   397
            addIt ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   398
                classNameWithoutPrefix ~~ fullClassName ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   399
                    tryToMatch value:classNameWithoutPrefix value:fullClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   400
                ].
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
        ]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   403
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   404
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   405
"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   406
"/        matches := ignCaseMatches.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   407
"/    ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   408
    matches := matches , ignCaseMatches.
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   409
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   410
"/    matches isEmpty ifTrue:[
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   411
"/        matches := ignCaseMatches.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   412
"/
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   413
"/"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   414
"/"/        | nearBy |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   415
"/"/        nearBy := SortedCollection new sortBlock:[:a :b | a key < b key].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   416
"/"/        others do:[:className |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   417
"/"/            |lcClassName dist cmpName|
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   418
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   419
"/"/            lcClassName := className asLowercase.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   420
"/"/            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
   421
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   422
"/"/            cmpName := lcClassName copyTo:(lcSearchName size min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   423
"/"/            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
   424
"/"/            cmpName := lcClassName copyTo:(lcSearchName size + 1 min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   425
"/"/            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
   426
"/"/            dist < 4 ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   427
"/"/                nearBy add:( dist -> (nsPrefix , className) ).
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
"/"/        ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   430
"/"/        matches := nearBy collect:[:eachPair | eachPair value].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   431
"/"/    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   432
"/    ].
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   433
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   434
    matches isEmpty ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   435
        ^ InputCompletionResult bestName:searchName matchingNames:(Array with:searchName)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   436
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   437
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   438
    matches size == 1 ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   439
        best := matches first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   440
        ^ 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
   441
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   442
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   443
    matches
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   444
        sort:[:name1 :name2 |
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   445
            "name1 comes before:name2 iff"
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   446
            ((name2 includes:$:) and:[(name1 includes:$:) not])
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   447
            or:[ ((name1 includes:$:) == (name2 includes:$:))
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   448
                  and:[ (name1 size < name2 size)
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   449
                        or: [ name1 < name2 ]]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   450
               ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   451
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   452
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   453
    isMatchString ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   454
        best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   455
    ] ifFalse:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   456
        matchesForLongestPrefix := matches select:[:m | m asLowercase startsWith:lcSearchName].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   457
        best := ignCaseMatches isEmpty
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   458
                    ifTrue:[ matchesForLongestPrefix longestCommonPrefix ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   459
                    ifFalse:[ matchesForLongestPrefix longestCommonPrefixCaseSensitive:false ].
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
        best size < aPartialClassName size "best size == 0" ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   462
            best := matchedNamesWithoutPrefix longestCommonPrefix.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   463
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   464
        best size == 0 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   465
            "if tried again, return next match"
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   466
            idx := ((matches indexOf:aPartialClassName) + 1) \\ matches size.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   467
            idx ~~ 1 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   468
                ^ InputCompletionResult bestName:(matches at:idx) matchingNames:(matches asArray)
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   469
            ].
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 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   472
            best := aPartialClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   473
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   474
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   475
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   476
    cls := anEnvironment classNamed:best.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   477
    (cls isBehavior and:[cls isNameSpace]) ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   478
        (matches conform:[:each | each = best
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   479
                                 or:[each startsWith:(best , '::')]])
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   480
        ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   481
            best := best , '::'
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   482
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   483
    ].
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   484
    ^ 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
   485
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   486
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   487
     Smalltalk classnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   488
     Smalltalk classnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   489
     Smalltalk classnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   490
     Smalltalk classnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   491
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   492
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   493
    "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
   494
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   495
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   496
classnameCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   497
    "given a partial classname, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   498
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   499
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   500
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   501
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   502
	classnameCompletion:aPartialClassName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   503
	filter:[:cls | true]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   504
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   505
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   506
    "
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   507
     self classnameCompletion:'Arr'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   508
     self classnameCompletion:'Arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   509
     self classnameCompletion:'arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   510
     self classnameCompletion:'*rray' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   511
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   512
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   513
    "Created: / 24-11-1995 / 17:24:45 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   514
    "Modified: / 10-08-2006 / 13:01:30 / cg"
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
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   517
entryCompletionBlockFor:completionSelector
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   518
    "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
   519
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   520
    ^ [:contents :field  |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   521
	  |s what m|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   522
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   523
	  s := contents withoutSpaces.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   524
	  field topView withCursor:(Cursor questionMark) do:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   525
	      what := self perform:completionSelector with:s with:Smalltalk.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   526
	  ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   527
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   528
	  field contents:(what first).
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   529
	  (what at:2) size ~~ 1 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   530
	      UserPreferences current beepInEditor ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   531
		field device beep
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   532
	      ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   533
	  ]
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   534
      ].
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   535
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   536
    "Created: / 10-08-2006 / 13:21:37 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   537
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   538
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   539
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   540
    "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
   541
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   542
		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
   543
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   544
    ^ self globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:true
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   545
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   546
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   547
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   548
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   549
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   550
     Smalltalk globalnameCompletion:'*rray'
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   551
    "
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   552
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   553
    "Created: / 10-08-2006 / 13:06:23 / cg"
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   554
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   555
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   556
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   557
    "given a partial globalName, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   558
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   559
		2nd: collection consisting of matching names"
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   560
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   561
    |searchName matches ignCaseMatches best isMatchString|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   562
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   563
    searchName := aPartialGlobalName.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   564
    searchName isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   565
	^ Array with:searchName with:#()
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   566
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   567
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   568
    (searchName at:1) isLowercase ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   569
	searchName := searchName copy asUppercaseFirst
2661
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
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   572
    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
   573
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   574
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   575
    anEnvironment keysDo:[:aGlobalName |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   576
	| addIt|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   577
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   578
	isMatchString ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   579
	    addIt := searchName match:aGlobalName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   580
	] ifFalse:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   581
	    addIt := aGlobalName startsWith:searchName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   582
	].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   583
	addIt ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   584
	    matches add:aGlobalName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   585
	] ifFalse:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   586
	    "/ try ignoring case
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   587
	    isMatchString ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   588
		addIt := searchName match:aGlobalName caseSensitive:false
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   589
	    ] ifFalse:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   590
		addIt := aGlobalName asLowercase startsWith:searchName asLowercase
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   591
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   592
	    addIt ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   593
		ignCaseMatches add:aGlobalName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   594
	    ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   595
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   596
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   597
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   598
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   599
	matches := ignCaseMatches
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   600
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   601
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   602
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   603
	^ 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
   604
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   605
    matches size == 1 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   606
	^ 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
   607
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   608
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   609
    isMatchString ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   610
	best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   611
    ] ifFalse:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   612
	best := matches longestCommonPrefix.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   613
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   614
    ^ 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
   615
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   616
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   617
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   618
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   619
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   620
     Smalltalk globalnameCompletion:'*rray'
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
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   623
    "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
   624
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   625
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   626
methodProtocolCompletion:aPartialProtocolName inEnvironment:anEnvironment
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   627
    "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
   628
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   629
		2nd: collection consisting of matching protocols"
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   630
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   631
    |matches best lcName|
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   632
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   633
    matches := IdentitySet new.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   634
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   635
    "/ search for exact match
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   636
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   637
	|protocol|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   638
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   639
	protocol := eachMethod category.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   640
	(protocol notNil and:[protocol startsWith:aPartialProtocolName]) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   641
	    matches add:protocol
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   642
	].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   643
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   644
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   645
	"/ search for case-ignoring match
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   646
	lcName := aPartialProtocolName asLowercase.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   647
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   648
	    |protocol|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   649
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   650
	    protocol := eachMethod category.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   651
	    (protocol notNil and:[protocol asLowercase startsWith:lcName]) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   652
		matches add:protocol
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   653
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   654
	].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   655
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   656
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   657
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   658
	^ Array with:aPartialProtocolName with:(Array with:aPartialProtocolName)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   659
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   660
    matches size == 1 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   661
	^ Array with:matches first with:(matches asArray)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   662
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   663
    matches := matches asSortedCollection.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   664
    best := matches longestCommonPrefix.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   665
    ^ Array with:best with:matches asArray
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   666
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
     Smalltalk methodProtocolCompletion:'doc'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   669
     Smalltalk methodProtocolCompletion:'docu'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   670
     Smalltalk methodProtocolCompletion:'documenta'
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   671
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   672
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   673
    "Created: / 10-08-2006 / 13:05:27 / cg"
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   674
    "Modified: / 16-03-2011 / 12:30:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
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
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   677
nameSpaceCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   678
    "given a partial name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   679
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   680
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   681
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   682
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   683
	classnameCompletion:aPartialClassName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   684
	filter:[:cls | cls isNameSpace]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   685
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   686
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   687
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   688
     DoWhatIMeanSupport nameSpaceCompletion:'To'  inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   689
    "
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
    "Created: / 10-08-2006 / 13:02:16 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   692
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   693
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   694
packageCompletion:aPartialPackage inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   695
    "given a partial package name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   696
     2 entries: 1st: the best (longest) match
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   697
                2nd: collection consisting of matching packages"
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
    |matches best lcName|
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   700
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   701
    matches := Smalltalk allPackageIDs
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   702
        select:[:package | package startsWith:aPartialPackage].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   703
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   704
    matches isEmpty ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   705
        "/ search for case-ignoring match
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   706
        lcName := aPartialPackage asLowercase.
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   707
        anEnvironment allClassesDo:[:aClass |
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   708
            |package|
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   709
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   710
            package := aClass package.
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   711
            (package notNil and:[package asLowercase startsWith:lcName]) ifTrue:[
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   712
                matches add:package
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   713
            ].
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   714
        ].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   715
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   716
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   717
    matches isEmpty ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   718
        ^ Array with:aPartialPackage with:(Array with:aPartialPackage)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   719
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   720
    matches size == 1 ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   721
        ^ Array with:matches first with:(matches asArray)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   722
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   723
    matches := matches asSortedCollection.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   724
    best := matches longestCommonPrefix.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   725
    ^ Array with:best with:matches asArray
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   726
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   727
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   728
     DoWhatIMeanSupport packageCompletion:'stx:' inEnvironment:Smalltalk
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   729
     DoWhatIMeanSupport packageCompletion:'stx:libw' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   730
    "
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
    "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
   733
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   734
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   735
packageNameEntryCompletionBlock
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   736
    "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
   737
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   738
    ^ self entryCompletionBlockFor:#'packageCompletion:inEnvironment:'
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   739
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   740
    "Created: / 10-08-2006 / 13:22:31 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   741
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   742
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   743
poolnameCompletion:aPartialClassName inEnvironment:anEnvironment
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   744
    "given a partial poolname, return an array consisting of
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   745
     2 entries: 1st: the best (longest) match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   746
		2nd: collection consisting of matching names"
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   747
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   748
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   749
	classnameCompletion:aPartialClassName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   750
	filter:[:cls | cls isSharedPool]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   751
	inEnvironment:anEnvironment
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   752
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   753
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   754
     self poolnameCompletion:'Win' inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   755
     self poolnameCompletion:'Z'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   756
     self poolnameCompletion:'a'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   757
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   758
!
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   759
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   760
resourceCompletion:aPartialResourceName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   761
    "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
   762
     2 entries: 1st: the longest match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   763
		2nd: collection consisting of matching defined resources"
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   764
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   765
    |matches best lcSym isMatch|
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   766
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   767
    matches := IdentitySet new.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   768
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   769
    isMatch := doMatch and:[aPartialResourceName includesMatchCharacters].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   770
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   771
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   772
	eachMethod hasResource ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   773
	    eachMethod resources keysDo:[:eachResourceName |
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   774
		(isMatch
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   775
		    ifTrue:[ (aPartialResourceName match:eachResourceName caseSensitive:ignoreCase not) ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   776
		    ifFalse:[ ignoreCase
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   777
				ifTrue:[ (eachResourceName asLowercase startsWith:aPartialResourceName asLowercase) ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   778
				ifFalse:[ (eachResourceName startsWith:aPartialResourceName) ] ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   779
		) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   780
		    matches add:eachResourceName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   781
		].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   782
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   783
	].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   784
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   785
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   786
	"/ search for case-ignoring match
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   787
	lcSym := aPartialResourceName asLowercase.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   788
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   789
	    eachMethod hasResource ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   790
		eachMethod resources keysDo:[:eachResourceName |
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   791
		    (isMatch
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   792
			ifTrue:[ (aPartialResourceName match:eachResourceName caseSensitive:false) ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   793
			ifFalse:[ (eachResourceName asLowercase startsWith:lcSym) ])
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   794
		     ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   795
			matches add:eachResourceName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   796
		    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   797
		].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   798
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   799
	].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   800
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   801
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   802
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   803
	^ Array with:aPartialResourceName with:#()
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   804
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   805
    matches size == 1 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   806
	^ Array with:matches first with:(matches asArray)
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   807
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   808
    matches := matches asSortedCollection.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   809
    best := matches longestCommonPrefix.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   810
    ^ Array with:best with:matches asArray
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   811
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   812
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   813
     DoWhatIMeanSupport resourceCompletion:'*debug*' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   814
     DoWhatIMeanSupport resourceCompletion:'context' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   815
     DoWhatIMeanSupport resourceCompletion:'key' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   816
     DoWhatIMeanSupport resourceCompletion:'cont' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   817
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   818
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   819
    "Created: / 06-07-2011 / 12:04:41 / cg"
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
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   822
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   823
    "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
   824
     2 entries: 1st: the longest match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   825
		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
   826
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   827
    ^ self selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:false
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   828
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   829
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   830
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   831
    "given a partial selector, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   832
     2 entries: 1st: the longest match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   833
		2nd: collection consisting of matching implemented selectors"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   834
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   835
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   836
	selectorCompletion:aPartialSymbolName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   837
	inEnvironment:anEnvironment
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   838
	match:doMatch
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   839
	ignoreCase:false
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   840
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   841
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   842
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   843
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   844
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   845
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   846
     DoWhatIMeanSupport selectorCompletion:'nextp' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   847
    "
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   848
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   849
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   850
    "Modified: / 26-10-2010 / 20:30:27 / cg"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   851
!
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   852
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   853
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   854
    "given a partial selector, return an array consisting of
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   855
     2 entries: 1st: the longest match
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   856
		2nd: collection consisting of matching implemented selectors"
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   857
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   858
    |matches best lcSym isMatch|
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   859
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   860
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   861
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   862
    isMatch := doMatch and:[aPartialSymbolName includesMatchCharacters].
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   863
3751
eafbe64ab0fc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3734
diff changeset
   864
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   865
	(isMatch
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   866
	    ifTrue:[ (aPartialSymbolName match:eachSelector caseSensitive:ignoreCase not) ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   867
	    ifFalse:[ ignoreCase
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   868
			ifTrue:[ (eachSelector asLowercase startsWith:aPartialSymbolName asLowercase) ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   869
			ifFalse:[ (eachSelector startsWith:aPartialSymbolName) ] ])
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   870
	 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   871
	    matches add:eachSelector
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   872
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   873
    ].
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   874
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   875
	"/ search for case-ignoring match
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   876
	lcSym := aPartialSymbolName asLowercase.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   877
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   878
	    (isMatch
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   879
		ifTrue:[ (aPartialSymbolName match:eachSelector caseSensitive:false) ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   880
		ifFalse:[ (eachSelector asLowercase startsWith:lcSym) ])
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   881
	     ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   882
		matches add:eachSelector
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   883
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   884
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   885
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   886
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   887
    matches isEmpty ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   888
	^ 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
   889
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   890
    matches size == 1 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
   891
	^ 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
   892
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   893
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   894
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   895
    ^ 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
   896
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   897
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   898
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   899
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   900
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3867
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   901
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   902
     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
   903
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   904
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   905
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   906
    "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
   907
! !
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   908
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   909
!DoWhatIMeanSupport class methodsFor:'rename support'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   910
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   911
goodRenameDefaultFor:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   912
    "generate a reasonable default for a rename operation.
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   913
     (used for rename category etc.)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
   914
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   915
    |prefix suffix lastNewSize lastOldSize left right inserted deleted tryAgain|
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   916
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   917
    lastNewName isNil ifTrue:[ ^ nil].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   918
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   919
    lastNewSize := lastNewName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   920
    lastOldSize := lastOldName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   921
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   922
    (lastNewName endsWith:lastOldName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   923
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   924
            'foo' -> 'Xfoo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   925
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   926
            'bar' would be 'Xbar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   927
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   928
        prefix := lastNewName copyTo:(lastNewSize - lastOldSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   929
        ^ (prefix , oldName).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   930
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   931
    (lastOldName endsWith:lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   932
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   933
            'Xfoo' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   934
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   935
            'Xbar' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   936
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   937
        prefix := lastOldName copyTo:(lastOldSize - lastNewSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   938
        (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   939
            ^ (oldName copyFrom:prefix size+1).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   940
        ]
2514
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   941
    ].
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   942
    (lastOldName asLowercase = lastNewName asLowercase) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   943
        (lastOldName first ~= lastNewName first) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   944
            (lastOldName first isLowercase = oldName first isLowercase) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   945
                "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   946
                    'xfoo' -> 'Xfoo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   947
                 then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   948
                    'xbar' would be 'Xbar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   949
                "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   950
                lastOldName first isLowercase ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   951
                    ^ oldName asUppercaseFirst "oldName first asUppercase asString , (oldName copyFrom:2)".
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   952
                ] ifFalse:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   953
                    ^ oldName asLowercaseFirst "oldName first asLowercase asString , (oldName copyFrom:2)".
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   954
                ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   955
            ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   956
        ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   957
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   958
    (lastOldName withoutSeparators = lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   959
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   960
            '  foo   ' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   961
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   962
            '  bar   ' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   963
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   964
        ^ oldName withoutSeparators.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   965
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   966
    (lastNewName startsWith:lastOldName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   967
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   968
            'foo' -> 'fooX'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   969
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   970
            'bar' would be 'barX'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   971
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   972
        suffix := lastNewName copyLast:(lastNewSize - lastOldSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   973
        ^ (oldName , suffix).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   974
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   975
    (lastOldName startsWith:lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   976
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   977
            'fooX' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   978
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   979
            'barX' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   980
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   981
        suffix := lastOldName copyLast:(lastOldSize - lastNewSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   982
        (oldName endsWith:suffix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   983
            ^ (oldName copyButLast:suffix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   984
        ]
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   985
    ].
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   986
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   987
    prefix := lastOldName commonPrefixWith:lastNewName.
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   988
    suffix := lastOldName commonSuffixWith:lastNewName.
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
   989
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   990
    (prefix size > 0) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   991
        (suffix size > 0) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   992
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   993
            prefix := prefix copyTo:(((lastNewName size - suffix size) min:(lastOldName size - suffix size)) min:prefix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   994
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   995
            "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   996
                'fooR' -> 'fooXR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   997
             then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   998
                'barR' would be 'barXR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   999
            "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1000
            left := lastOldName copyTo:prefix size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1001
            right := lastOldName copyLast:suffix size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1002
            lastNewSize > lastOldSize ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1003
                inserted := (lastNewName copyFrom:(left size + 1)) copyButLast:(right size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1004
                inserted size > 0 ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1005
                    (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1006
                        ^ oldName copyWithAll:inserted insertedAfterIndex:prefix size
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1007
                    ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1008
                ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1009
            ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1010
            (oldName string endsWith:suffix string) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1011
                deleted := (lastOldName string copyFrom:(prefix size + 1)) copyButLast:(suffix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1012
                (oldName size-suffix size-deleted size + 1) >= 1 ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1013
                    ((oldName copyFrom:oldName size-suffix size-deleted size + 1) copyTo:deleted size) = deleted ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1014
                        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1015
                            'fooXR' -> 'fooR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1016
                         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1017
                            'barXS' would be 'barS'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1018
                        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1019
                        ^ (oldName copyTo:oldName size-suffix size-deleted size) , suffix
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1020
                    ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1021
                ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1022
            ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1023
        ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1024
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1025
        (oldName endsWith:(lastOldName copyFrom:prefix size+1)) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1026
            "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1027
                'fooX' -> 'fooY'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1028
             then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1029
                'barX' would be 'barY'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1030
            "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1031
            left := oldName copyButLast:(lastOldName copyFrom:prefix size+1) size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1032
            right := lastNewName copyFrom:prefix size+1.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1033
            ^ left , right
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1034
        ]
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1035
    ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1036
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1037
    suffix size > 0 ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1038
        |prefix2|
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1039
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1040
        "last rename was:
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1041
            'fooSUFF1' -> 'barSUFF1'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1042
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1043
            'fooSUFF2' -> 'barSUFF2'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1044
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1045
        prefix := lastOldName copyTo:(lastOldName size - suffix size).  "/ the foo
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1046
        (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1047
            prefix2 := lastNewName copyTo:(lastNewName size - suffix size). "/ the bar
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1048
            ^ prefix2,(oldName copyFrom:(prefix size+1)).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1049
        ].
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1050
    ].
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1051
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1052
    "/ was there something stripped at the end?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1053
    suffix := oldName commonSuffixWith:lastOldName.
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1054
    (suffix size > 0) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1055
        ^ self
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1056
            goodRenameDefaultFor:(oldName copyButLast:suffix size)
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1057
            lastOld:(lastOldName copyButLast:suffix size)
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1058
            lastNew:lastNewName.
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1059
    ].
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1060
    ^ nil
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1061
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1062
    "
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1063
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fooXX'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1064
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'XXfoo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1065
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1066
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'foo'
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1067
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1068
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1069
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'fooYY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1070
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1071
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1072
     self goodRenameDefaultFor:'bar2' lastOld:'foo1' lastNew:'foo01'
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
  1073
     self goodRenameDefaultFor:'barXY' lastOld:'fooXY' lastNew:'fooY'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1074
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1075
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXXXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1076
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'foXXXo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1077
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1078
     self goodRenameDefaultFor:'bar001' lastOld:'foo001' lastNew:'foo002_001'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1079
     self goodRenameDefaultFor:'CoastCore-CSFoo' lastOld:'CoastCore-CSBar' lastNew:'Coast-Core-CSBar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1080
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1081
     self goodRenameDefaultFor:'mti.odt2.level1HeadlineStyle'
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1082
                       lastOld:'mti.odt2.level1HeadlineMatchPattern'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1083
                       lastNew:'Key_odt2_level1HeadlineMatchPattern'
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1084
    "
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1085
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1086
    "Modified: / 24-07-2011 / 11:06:03 / cg"
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1087
!
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1088
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1089
goodRenameDefaultForFile:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
  1090
    "generate a reasonable default for a file rename operation.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1091
     (Try to rename multiple files in the new fileBrowser,
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
  1092
     to see what this is doing)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
  1093
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1094
    |prefix suffix t
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1095
     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
  1096
     lastRemoved lastInserted default|
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1097
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1098
    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
  1099
    default notNil ifTrue:[ ^ default].
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1100
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1101
    lastOldWOSuffix := lastOldName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1102
    lastNewWOSuffix := lastNewName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1103
    oldWOSuffix := oldName asFilename nameWithoutSuffix.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1104
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1105
    "/ suffix change ?
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1106
    lastOldWOSuffix = lastNewWOSuffix ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1107
	lastOldName asFilename suffix ~= lastNewName asFilename suffix ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1108
	    ^ (oldName asFilename withSuffix:(lastNewName asFilename suffix)) pathName
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1109
	].
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1110
    ].
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1111
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1112
    default := self goodRenameDefaultFor:oldWOSuffix lastOld:lastOldWOSuffix lastNew:lastNewWOSuffix.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1113
    default notNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1114
	lastOldRest := lastOldName copyFrom:lastOldWOSuffix size + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1115
	lastNewRest := lastNewName copyFrom:lastNewWOSuffix size + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1116
	oldRest := oldName copyFrom:oldWOSuffix size + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1117
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1118
	^ default , lastNewRest
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1119
    ].
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1120
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1121
    prefix := lastOldWOSuffix commonPrefixWith:oldWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1122
    (lastNewWOSuffix startsWith:prefix) ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1123
	lastOldRest := lastOldWOSuffix copyFrom:prefix size + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1124
	lastNewRest := lastNewWOSuffix copyFrom:prefix size + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1125
	oldRest := oldWOSuffix copyFrom:prefix size + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1126
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1127
	(lastNewRest endsWith:lastOldRest) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1128
	    t := lastNewRest copyButLast:lastOldRest size.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1129
	    ^ ((prefix , t , oldRest) asFilename withSuffix:oldName asFilename suffix) name
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1130
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1131
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1132
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1133
    suffix := lastOldWOSuffix commonSuffixWith:lastNewWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1134
    suffix size > 0 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1135
	"/ last change changed something at the beginning
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1136
	prefix := oldWOSuffix commonPrefixWith:lastOldWOSuffix.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1137
	prefix size > 0 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1138
	    "/ this name starts with the same characters
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1139
	    lastRemoved := lastOldWOSuffix copyButLast:suffix size.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1140
	    lastInserted := lastNewWOSuffix copyButLast:suffix size.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1141
	    (lastRemoved startsWith:lastInserted) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1142
		oldWOSuffix size >= lastInserted size ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1143
		    ^ (oldWOSuffix copyTo:lastInserted size) , (oldName copyFrom:lastRemoved size + 1)
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1144
		]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1145
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1146
	    ^ lastInserted , (oldName copyFrom:lastRemoved size + 1)
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1147
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1148
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1149
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1150
    ^ nil
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1151
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1152
    "Modified: / 07-11-2006 / 13:58:39 / cg"
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1153
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1154
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1155
!DoWhatIMeanSupport class methodsFor:'typing distance'!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1156
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1157
isKey:k1 nextTo:k2
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1158
    "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
  1159
     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
  1160
     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
  1161
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1162
    ^ 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
  1163
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1164
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1165
     self isKey:$a nextTo:$a
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1166
     self isKey:$a nextTo:$s
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1167
     self isKey:$a nextTo:$q
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1168
     self isKey:$a nextTo:$w
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1169
     self isKey:$a nextTo:$z
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1170
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1171
    "
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1172
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1173
    "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
  1174
!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1175
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1176
isKey:k1 nextTo:k2 onKeyboard:keys
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1177
    "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
  1178
     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
  1179
     (typo checker uses a modified levenshtein, 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1180
      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
  1181
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1182
    |row1 row2 col1 col2|
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1183
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1184
    row1 := keys findFirst:[:eachRow | col1 := eachRow indexOf:k1. col1 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1185
    row1 == 0 ifTrue:[^ false].
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1186
    row2 := keys findFirst:[:eachRow | col2 := eachRow indexOf:k2. col2 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1187
    row2 == 0 ifTrue:[^ false].
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1188
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1189
    ^ (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
  1190
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1191
    "
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1192
     self isKey:$a nextTo:$q
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1193
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1194
    "
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1195
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1196
    "Modified (comment): / 01-05-2016 / 12:19:24 / cg"
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1197
!
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1198
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1199
keyboard
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1200
    "the keyboard layout
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1201
     (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
  1202
     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
  1203
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1204
    |lang|
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1205
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1206
    lang := UserPreferences current language.
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1207
    lang == #de ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1208
	^ #(
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1209
	       '1234567890-'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1210
	       '*qwertzuiop'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1211
	       '**asdfghjkl:'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1212
	       '***yxcvbnm'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1213
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1214
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1215
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1216
    lang == #fr ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1217
	^ #(
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1218
	       '1234567890'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1219
	       '*azertyuiop'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1220
	       '**qsdfghjklm'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1221
	       '***wxcvbn,'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1222
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1223
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1224
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1225
    ^ #(
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1226
	   '1234567890-'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1227
	   '*qwertyuiop'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1228
	   '**asdfghjkl:'
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1229
	   '***zxcvbnm'
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1230
    ).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1231
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1232
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1233
     self keyboard
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
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1236
    "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
  1237
! !
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1238
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1239
!DoWhatIMeanSupport methodsFor:'code completion'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1240
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1241
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
  1242
    "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
  1243
     (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
  1244
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1245
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1246
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1247
        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
  1248
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1249
           (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
  1250
     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
  1251
     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
  1252
     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
  1253
     perform the completion.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1254
     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
  1255
     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
  1256
     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
  1257
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1258
     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
  1259
     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
  1260
     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
  1261
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1262
    | language |
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1263
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1264
    codeAspect := codeAspectArg.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1265
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1266
    languageOrNilArg notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1267
        language := languageOrNilArg
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1268
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1269
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1270
            | method |
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1271
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1272
            method := contextOrNilArg method.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1273
            method notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1274
                language := method programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1275
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1276
                contextOrNilArg isJavaContext ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1277
                    language := JavaLanguage instance
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1278
                ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1279
                    language := SmalltalkLanguage instance.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1280
                ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1281
            ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1282
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1283
            methodOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1284
                language := methodOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1285
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1286
                classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1287
                    language := classOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1288
                ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1289
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1290
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1291
    ].
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 notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1294
        language isSmalltalk ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1295
            ^self codeCompletionForSmalltalkMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1296
        ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1297
        language isSTXJavaScript ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1298
            ^self codeCompletionForJavascriptMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1299
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1300
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1301
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1302
    "/ No completion support for given language
5051
6e150dbaf9bc #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 5050
diff changeset
  1303
    "/ 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
  1304
    self breakPoint: #jv.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1305
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1306
    "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
  1307
    "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
  1308
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1309
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1310
codeCompletionForLanguage: languageOrNil class: classOrNilArg context:contextOrNilArg codeView:codeViewArg
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1311
    "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
  1312
     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
  1313
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1314
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1315
     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
  1316
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1317
    | language |
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1318
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1319
    languageOrNil notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1320
        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
  1321
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1322
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1323
            language := contextOrNilArg method programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1324
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1325
            classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1326
                language := classOrNilArg programmingLanguage.
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
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1329
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1330
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1331
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1332
        language isSmalltalk ifTrue:[
4731
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1333
            classOrNil := classOrNilArg.
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1334
            contextOrNil := contextOrNilArg.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1335
            ^self codeCompletionForSmalltalkClass: classOrNil context: contextOrNil codeView: codeViewArg
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1336
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1337
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1338
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1339
    "/ 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
  1340
    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
  1341
    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
  1342
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1343
    "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
  1344
!
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1345
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1346
setClass: classOrNilArg andContext:contextOrNilArg
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1347
    classOrNil := classOrNilArg.
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1348
    contextOrNil := contextOrNilArg.
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1349
!
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1350
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1351
setSelf: instanceOrNilArg 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1352
    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
  1353
! !
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1354
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1355
!DoWhatIMeanSupport methodsFor:'code completion - JavaScript'!
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1356
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1357
codeCompletionForJavascriptMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1358
    "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
  1359
     (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
  1360
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1361
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1362
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1363
        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
  1364
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1365
           (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
  1366
     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
  1367
     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
  1368
     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
  1369
     perform the completion.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1370
     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
  1371
     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
  1372
     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
  1373
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1374
     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
  1375
     or nil, if called from the browser.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1376
     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
  1377
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1378
    languageOrNil := STXJavaScriptLanguage instance.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1379
    methodOrNil := methodOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1380
    classOrNil := classOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1381
    codeView := codeViewArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1382
    contextOrNil := contextOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1383
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1384
    JavaScriptCompletionEngine notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1385
        JavaScriptCompletionEngine new
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1386
           completeForMethod: methodOrNil class: classOrNil context: contextOrNil codeView: codeView into: actionBlock.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1387
    ].
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1388
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1389
    self information:'Not yet supported'.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1390
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1391
    "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
  1392
    "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
  1393
! !
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1394
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1395
!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
  1396
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1397
codeCompletionForSmalltalkClass: classOrNilArg context:contextOrNilArg codeView:codeViewArg
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1398
4379
f79671ee6211 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4378
diff changeset
  1399
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1400
     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
  1401
     nil, if called from the browser.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1402
     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
  1403
     This is not yet done, sigh"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1404
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1405
    |crsrPos char interval source node parent checkedNode instanceOrNilArg
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1406
     forceNewMessageSend classOfReceiver prevChar|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1407
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1408
    languageOrNil := SmalltalkLanguage instance.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1409
    classOrNil := classOrNilArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1410
    codeView := codeViewArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1411
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1412
    crsrPos := codeView characterPositionOfCursor"-1".
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1413
    char := codeView characterAtCharacterPosition:crsrPos.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1414
    "/ Transcript show:crsrPos; show:' '; showCR:char.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1415
    [crsrPos > 1 and:[char isSeparator or:['.' includes:char]]] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1416
        crsrPos := crsrPos - 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1417
        char := codeView characterAtCharacterPosition:crsrPos.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1418
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1419
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1420
    interval := codeView selectedInterval.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1421
    "/ Transcript show:'iv: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1422
    interval isEmpty ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1423
        interval := crsrPos"-1" to:crsrPos.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1424
        "/ Transcript show:'iv2: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1425
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1426
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1427
    source := codeView contentsAsString string.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1428
    source := source copyTo:crsrPos.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1429
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1430
    "/ this is too naive and stupid; if there is a syntactic error,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1431
    "/ 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
  1432
    "/ 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
  1433
    "/ without any progress.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1434
    "/ 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
  1435
    "/ as it parses the code. Stop, when the interval is hit.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1436
    "/ that will also work for syntactic incorrect source code.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1437
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1438
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1439
        "/ Transcript show:'nd1: '; showCR:node.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1440
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1441
    node isNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1442
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1443
        "/ Transcript show:'nd2 try: '; showCR:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1444
        node isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1445
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1446
            self breakPoint:#cg.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1447
            "/ self information:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1448
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1449
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1450
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1451
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1452
    forceNewMessageSend := false.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1453
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1454
    "/ 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
  1455
    prevChar := codeView characterBeforeCursor.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1456
    (prevChar isSeparator or:[ ')}]''' includes:prevChar ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1457
        (node isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1458
            and:[ (parent := node parent) notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1459
            and:[ parent isMessage ]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1460
        ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1461
            "/ completion after a variable node...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1462
            parent isKeyword ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1463
                "/ and it is a keyword message, we complete the keyword message instead
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1464
                node := parent.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1465
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1466
                "/ 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
  1467
                "/ (however, no character is available to determine what is useful)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1468
                forceNewMessageSend := true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1469
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1470
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1471
            (node isMessage and:[node isUnary]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1472
                "/ expanding <rcvr> foo |<- cursor here (i.e. a space after foo)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1473
                "/
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1474
                forceNewMessageSend := true.
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1475
"/                "/ can we see what we get from foo?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1476
"/                classOfReceiver := self
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1477
"/                                    classOfReceiver:node receiver
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1478
"/                                    inClass:classOrNil instance:instanceOrNil context:contextOrNil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1479
"/                classOfReceiver notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1480
"/                    |mthd|
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1481
"/
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1482
"/                    mthd := classOfReceiver lookupMethodFor:node selector.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1483
"/                    mthd notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1484
"/                        self halt.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1485
"/                        (ParseTreeSearcher isDefinitelyGetterMethod:mthd) ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1486
"/                            forceNewMessageSend := true.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1487
"/                        ]
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
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1490
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1491
        ]
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1492
    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1493
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1494
    forceNewMessageSend ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1495
        "/ completion with nothing to start (right after a variable)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1496
        "/ 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
  1497
        classOfReceiver := self classOfNode:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1498
        classOfReceiver isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1499
            "/ 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
  1500
            "/ will be...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1501
            Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1502
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1503
            |superClass possible choice|
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
            possible := classOfReceiver selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1506
            superClass := classOfReceiver superclass.
4938
bedac0cfaf04 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4936
diff changeset
  1507
            [superClass notNil "and:[(possible size + superClass selectors size) < 500]"] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1508
                possible := possible,superClass selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1509
                superClass := superClass superclass.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1510
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1511
            possible := possible copy sort.
4938
bedac0cfaf04 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4936
diff changeset
  1512
            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
  1513
            choice isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1514
                Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1515
                ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1516
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1517
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1518
            codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1519
                undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1520
                    codeView insertStringAtCursor:choice
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1521
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1522
                info:'Completion'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1523
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1524
        ^ self
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1525
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1526
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1527
    node isVariable ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1528
        self codeCompletionForVariable:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1529
        ^ self.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1530
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1531
    node isLiteral ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1532
        node value isSymbol ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1533
            self codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1534
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1535
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1536
        ^ self "/ huh - strings or what?
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1537
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1538
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1539
    checkedNode := node.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1540
    [checkedNode notNil] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1541
        checkedNode isMessage ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1542
            "/ completion in a message-send
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1543
            contextOrNilArg notNil ifTrue:[
4329
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1544
"/                |rcvrNode idx rcvr val|
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1545
"/
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1546
"/                (rcvrNode := checkedNode receiver) isVariable ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1547
"/                    rcvrNode isSelf ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1548
"/                        classOrNil := contextOrNil receiver class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1549
"/                    ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1550
"/                        (idx := contextOrNil argAndVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1551
"/                            val := contextOrNil argsAndVars at:idx.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1552
"/                            classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1553
"/                        ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1554
"/                            (idx := contextOrNil receiver class allInstVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1555
"/                                val := contextOrNil receiver instVarNamed:rcvrNode name.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1556
"/                                classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1557
"/                            ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1558
"/                        ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1559
"/                    ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1560
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1561
                instanceOrNilArg := contextOrNilArg receiver
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1562
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1563
            self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1564
                codeCompletionForMessage:checkedNode
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1565
                inClass:classOrNil instance:instanceOrNilArg
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1566
                context:contextOrNilArg codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1567
            ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1568
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1569
        checkedNode isMethod ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1570
            "/ completion in a method's selector pattern
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1571
            self codeCompletionForMethodSpec:checkedNode.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1572
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1573
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1574
        checkedNode := checkedNode parent.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1575
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1576
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1577
    self information:'Node is neither variable nor message.'.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1578
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1579
    "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
  1580
!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1581
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1582
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
  1583
    "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
  1584
     (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
  1585
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1586
     The interface has been defined in that way 
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1587
     (and tight coupling with internals of the editor) 
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1588
     because
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1589
        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
  1590
        2) the edit operation for completion may be non-trivial
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1591
           (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
  1592
           
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1593
     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
  1594
     or adding another keyword part after the cursor is possible.
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1595
     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
  1596
     to perform the completion.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1597
     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
  1598
     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
  1599
     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
  1600
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1601
     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
  1602
     or nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1603
     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
  1604
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1605
    |crsrPos char interval i source partialSource cursorLineSource
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1606
     suggestions actions title suggestionCollector|
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1607
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1608
    languageOrNil := SmalltalkLanguage instance.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1609
    methodOrNil := methodOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1610
    classOrNil := classOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1611
    codeView := codeViewArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1612
    contextOrNil := contextOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1613
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1614
"/    classOrNil isNil ifTrue:[
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1615
"/        self information:'No class'.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1616
"/        ^ self.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1617
"/    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1618
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1619
    crsrPos := codeView characterPositionOfCursor.
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  1620
    char := codeView characterAtCharacterPosition:(crsrPos-1 max:1).
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1621
    [crsrPos > 1 and:[char isSeparator "or:['.' includes:char]"]] whileTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1622
        crsrPos := crsrPos - 1.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1623
        char := codeView characterAtCharacterPosition:crsrPos.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1624
    ].
4711
1c2e635489e5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4710
diff changeset
  1625
    char == $. ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1626
        "/ either at end of statement or after a character constant
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1627
        crsrPos == 1 ifTrue:[^ self].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1628
        (codeView characterAtCharacterPosition:crsrPos-1) == $$ ifFalse:[^ self].
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1629
    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1630
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1631
    suggestionCollector :=
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1632
        [:listOfSuggestions :listOfActionsOrBlock :titleWhenAsking|
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1633
            
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1634
            "/ may be called multiple times!!
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1635
            "/ may also be called for duplicate suggestions!!
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1636
            suggestions isNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1637
                suggestions := listOfSuggestions.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1638
                actions := listOfActionsOrBlock.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1639
            ] ifFalse:[    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1640
                suggestions := suggestions asOrderedCollection.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1641
                actions isBlock ifTrue:[
5523
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  1642
                    actions := Array new:(suggestions size) withAll:actions.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1643
                ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1644
                actions := actions asOrderedCollection.
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1645
                listOfSuggestions doWithIndex:[:suggestion :idx |
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1646
                    (suggestions includes:suggestion) ifFalse:[
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1647
                        suggestions add:suggestion.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1648
                        listOfActionsOrBlock isBlock ifTrue:[
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1649
                            actions add:listOfActionsOrBlock.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1650
                        ] ifFalse:[
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1651
                            actions add:(listOfActionsOrBlock at:idx).
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1652
                        ]
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1653
                    ]
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1654
                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1655
            ].
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1656
            title := titleWhenAsking.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1657
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1658
        
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1659
    interval := crsrPos-1 to:crsrPos.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1660
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1661
    source := codeView contentsAsString string.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1662
    partialSource := source copyTo:crsrPos.
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1663
    partialSource isWhitespace ifTrue:[^ self].
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1664
    
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1665
    methodOrNilArg isNil ifTrue:[
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1666
        (partialSource endsWith:Character cr) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1667
            partialSource := partialSource copyButLast.
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1668
        ].    
5504
dbae466ee892 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5502
diff changeset
  1669
        cursorLineSource := partialSource copy.
dbae466ee892 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5502
diff changeset
  1670
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1671
        "/ this cares for doIt expressions in the last cursor line;
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1672
        "/ 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
  1673
        "/ (then it is likely, that the user wants to define a new method)
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1674
        (partialSource first isLowercase) ifFalse:[
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1675
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1676
            "/ first try parsing the current cursor line.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1677
            "/ 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
  1678
            (i := partialSource lastIndexOf:Character cr) ~~ 0 ifTrue:[
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1679
                "/ because cursorPositions and node-positions are required elsewhere to be correct,
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1680
                "/ 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
  1681
                "/ 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
  1682
                "/ 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
  1683
                "/ we must preserve the line structure (i.e. keep crs).
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1684
                1 to:i do:[:pos | 
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1685
                    (cursorLineSource at:pos) ~= Character cr ifTrue:[
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1686
                        cursorLineSource at:pos put:Character space.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1687
                    ]
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1688
                ].
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1689
            ].    
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1690
            self
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1691
                tryCodeCompletionWithSource:cursorLineSource nodeInterval:interval
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1692
                at:crsrPos mustBeExpression:true
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1693
                into:suggestionCollector.
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1694
        ].
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1695
    ].
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1696
    
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1697
    true "suggestions isNil" ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1698
        "/ try parsing the partial source (from beginning up to the cursor)
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1699
        self
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1700
            tryCodeCompletionWithSource:partialSource nodeInterval:interval
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1701
            at:crsrPos mustBeExpression:(classOrNilArg isNil and:[methodOrNilArg isNil])
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1702
            into:suggestionCollector.
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1703
    ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1704
5509
16997be94f7f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5508
diff changeset
  1705
    true "suggestions isEmptyOrNil" ifTrue:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1706
        "/ try parsing the whole source
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1707
        self
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1708
            tryCodeCompletionWithSource:source nodeInterval:interval
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1709
            at:crsrPos mustBeExpression:false
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1710
            into:suggestionCollector
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1711
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1712
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1713
    suggestions isEmptyOrNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1714
        "/ nothing found
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1715
        ^ self
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1716
    ].    
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1717
    actionBlock value:suggestions value:actions value:title.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1718
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1719
    "Created: / 18-09-2013 / 15:25:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  1720
    "Modified: / 08-04-2017 / 16:31:11 / cg"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1721
! !
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1722
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1723
!DoWhatIMeanSupport methodsFor:'code completion - obsolete'!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1724
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1725
codeCompletionForClass:classOrNilArg context:contextOrNil codeView:codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1726
    <resource: #obsolete>
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1727
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1728
     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
  1729
     nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1730
     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
  1731
     This is not yet done, sigh"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1732
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1733
    ^self codeCompletionForLanguage: nil class:classOrNilArg context:contextOrNil codeView:codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1734
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1735
    "Modified: / 04-07-2006 / 18:48:26 / fm"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1736
    "Modified: / 28-08-2013 / 17:15:25 / cg"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1737
    "Modified: / 18-09-2013 / 14:15:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1738
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1739
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1740
codeCompletionForMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1741
    <resource: #obsolete>
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1742
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1743
	codeCompletionForSmalltalkMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1744
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1745
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1746
!DoWhatIMeanSupport methodsFor:'code completion-helpers'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1747
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1748
askUserForCompletion:what for:codeView at:position from:allTheBest
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1749
    |list choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1750
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1751
    "/ cg: until the new stuff works,...
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1752
    ^ self old_askUserForCompletion:what for:codeView from:allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1753
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1754
"/    allTheBest isEmpty ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1755
"/        ^ nil
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1756
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1757
"/    allTheBest size == 1 ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1758
"/        ^ allTheBest first
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1759
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1760
"/    list := allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1761
"/    LastChoices notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1762
"/        lastChoice := LastChoices at:what ifAbsent:nil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1763
"/        lastChoice notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1764
"/            list := { lastChoice allBold } , (list copyWithout:lastChoice).
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1765
"/        ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1766
"/    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1767
"/    choice := Tools::CodeCompletionMenu
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1768
"/                openFor:codeView
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1769
"/                at:position
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1770
"/                with:allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1771
"/    LastChoices isNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1772
"/        LastChoices := Dictionary new.
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
"/    LastChoices at:what put:choice.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1775
"/    ^ choice string
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1776
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1777
    "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
  1778
    "Modified: / 28-08-2013 / 16:41:35 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1779
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1780
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1781
askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1782
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1783
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1784
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1785
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1786
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1787
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1788
    LastChoices notNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1789
	lastChoice := LastChoices at:what ifAbsent:nil.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1790
	lastChoice notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1791
	    list := {lastChoice. nil. } , (list copyWithout:lastChoice).
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1792
	].
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
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1795
    list size < 30 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1796
	|menu idx exitKey|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1797
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1798
	menu := PopUpMenu labels:list.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1799
	menu hideOnKeyFilter:[:key | |hide|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1800
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1801
		hide ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1802
		    exitKey := key.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1803
		].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1804
		hide].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1805
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1806
	idx := menu startUp.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1807
	idx == 0 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1808
	    exitKey notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1809
		codeView keyPress:exitKey x:0 y:0.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1810
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1811
	    ^ nil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1812
	].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1813
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1814
    ] ifFalse:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1815
	resources := codeView application isNil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1816
			ifTrue:[ codeView resources]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1817
			ifFalse:[ codeView application resources ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1818
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1819
	choice := Dialog
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1820
	   choose:(resources string:'Choose ',what)
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1821
	   fromList:list
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1822
	   lines:20
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1823
	   title:(resources string:'Code completion').
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1824
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1825
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1826
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1827
    LastChoices isNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1828
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1829
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1830
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1831
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1832
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1833
    "Created: / 10-11-2006 / 14:00:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1834
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1835
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1836
codeCompletionForBlockArgument:node into:actionBlock
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1837
!
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1838
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1839
codeCompletionForLiteralSymbol:nodeOrNil element:tokenOrNil considerAll:considerAll into:actionBlock
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1840
    "looking for all symbols is way too much and imprecise;
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1841
     experiment: only present symbols which are used by the class,
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1842
     and classes in that class category, or at least: implemented as method.
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1843
     We'll see..."
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1844
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1845
    |sym possibleCompletions longest editAction start stop addSymbol
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1846
     parentSelector parent symbolSelectorClass|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1847
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  1848
    "/ Transcript show:'lit in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1849
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1850
    start := (nodeOrNil ? tokenOrNil) start.
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1851
    stop := (nodeOrNil ? tokenOrNil) stop.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1852
    (codeView characterAtCharacterPosition:stop) == $' ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1853
        ^ self.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1854
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1855
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1856
    sym := (nodeOrNil ? tokenOrNil) value.
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1857
    possibleCompletions := Set new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1858
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1859
    addSymbol :=
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1860
        [:aSymbol |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1861
            (aSymbol startsWith:sym) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1862
                (aSymbol = sym) ifFalse:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1863
                    possibleCompletions add:aSymbol
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1864
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1865
            ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1866
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1867
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1868
    (nodeOrNil notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1869
    and:[ (parent := nodeOrNil parent) notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1870
    and:[ parent isMessage ]]) ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1871
        parentSelector := parent selector.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1872
        ( #( perform: perform:ifNotUnderstood: ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1873
            symbolSelectorClass := self classOfNode:parent receiver.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1874
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1875
        ( #( #'onChangeSend:' ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1876
            "/ assume that send-target will be self.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1877
            (methodOrNil notNil and:[ methodOrNil selector notNil and:[ methodOrNil selector isUnarySelector ]]) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1878
                addSymbol value:(methodOrNil selector,'Changed').
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1879
            ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1880
            symbolSelectorClass := classOrNil.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1881
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1882
        ( #( #'onChangeSend:to:' ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1883
            symbolSelectorClass := self classOfNode:parent arguments second.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1884
        ].
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1885
5074
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1886
        "/ actually, I found that this gives good suggestions.
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1887
        symbolSelectorClass isNil ifTrue:[
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1888
            symbolSelectorClass := classOrNil.
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1889
        ].
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1890
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1891
        symbolSelectorClass notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1892
            symbolSelectorClass withAllSuperclassesDo:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1893
                cls ~~ Object ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1894
                    cls ~~ Model ifTrue:[
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  1895
                        cls selectorsDo:addSymbol.
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1896
                    ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1897
                ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1898
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1899
        ].
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1900
    ].
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1901
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1902
    (considerAll or:[classOrNil isNil]) ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1903
        Smalltalk allClassesDo:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1904
            cls theNonMetaclass methodDictionary keys do:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1905
            cls theMetaclass methodDictionary keys do:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1906
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1907
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1908
        "/ Symbol allInstancesDo:addSymbol.
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1909
    ] ifFalse:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1910
        Smalltalk allClassesInCategory:classOrNil do:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1911
            cls theNonMetaclass instAndClassMethodsDo:[:mthd |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1912
                mthd usedSymbols do:addSymbol
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1913
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1914
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1915
    ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1916
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1917
    "/ add symbolic literals (especially for spec methods)
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1918
    classOrNil notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1919
        classOrNil theMetaclass instAndClassMethodsDo:[:mthd |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1920
            mthd literalsDo:[:lit |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1921
                lit isSymbol ifTrue:[ addSymbol value: lit ]
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1922
            ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1923
        ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1924
    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1925
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1926
    possibleCompletions := possibleCompletions asOrderedCollection sort.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1927
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1928
    longest := possibleCompletions longestCommonPrefix.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1929
    possibleCompletions remove:longest ifAbsent:[].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1930
    possibleCompletions addFirst: longest.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1931
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1932
    editAction :=
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1933
        [:chosenIndex |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1934
            |chosen oldSym oldLen newLen|
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1935
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1936
            chosen := possibleCompletions at:chosenIndex.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1937
            chosen notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1938
                (codeView characterAtCharacterPosition:start) == $# ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1939
                    start := start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1940
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1941
                (codeView characterAtCharacterPosition:start) == $' ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1942
                    start := start + 1.
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
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1945
                oldSym := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1946
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1947
                codeView
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1948
                    undoableDo:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1949
                        codeView replaceFromCharacterPosition:start to:stop with:chosen
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1950
                    ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1951
                    info:'Completion'.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1952
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1953
                (chosen startsWith:oldSym) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1954
                    oldLen := stop - start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1955
                    newLen := chosen size.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1956
                    codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1957
                    codeView dontReplaceSelectionOnInput
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1958
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1959
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1960
        ].
4352
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
    actionBlock value:possibleCompletions value:editAction value:'symbol'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1963
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1964
    "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
  1965
    "Modified: / 10-02-2017 / 10:32:54 / cg"
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  1966
    "Modified (comment): / 17-05-2017 / 12:13:33 / mawalch"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1967
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1968
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1969
codeCompletionForMessage:node into:actionBlock
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1970
    "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
  1971
    
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1972
    |selector lcSelector bestSelectors parentSelector newParentSelector bestSelectors2 bestWithParenthesis allBest numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1973
     newParts nSelParts oldLen newLen selectorParts
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1974
     parentNode nodeReceiver "selectorsSentInCode" selectorsImplementedInClass
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  1975
     editAction parentNodeClassIfKnown
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1976
     receiverNodeClassIfKnown 
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1977
     offerParenthisationAroundNode parenthesisAroundIndex parentNodeToParenthesize
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1978
     offerValueInsertion valueToInsert valueToInsertIndex valueInfo
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1979
     classesFromAssignmentsToReceiver otherMessagesToReceiver
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  1980
     canParenthesize classesOfReceiver|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1981
 
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1982
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1983
        Transcript show:'node '; show:node; show:' ; '.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1984
        Transcript show:'msg in '; show:methodOrNil; show:' / '; showCR:classOrNil.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1985
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1986
    
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1987
    offerParenthisationAroundNode := nil.
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1988
    offerValueInsertion := false.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1989
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1990
    selector := node selector.
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  1991
    lcSelector := selector asLowercase.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1992
    parentNode := node parent.
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  1993
    nodeReceiver := node receiver.
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  1994
    nodeReceiver notNil ifTrue:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  1995
        classesOfReceiver := self classesOfNode:nodeReceiver.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  1996
    ].
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1997
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1998
        Transcript show:node; show:' -> '; showCR:classesOfReceiver.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1999
        ( node isVariable and:[node name = 'self']) ifTrue:[self halt].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2000
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2001
    
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2002
    "/ 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
  2003
    "/ do not attempt to complete the current message.
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2004
    "/ 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
  2005
    (codeView characterBeforeCursor ? Character space) isSeparator ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2006
        selector isKeyword ifFalse:[
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2007
            self codeCompletionForMessageTo:node into:actionBlock.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2008
            ^ self
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2009
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2010
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2011
 
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2012
    "/ only do this if the node-message has no parents around
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2013
    node parentheses isEmptyOrNil ifTrue:[
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2014
        Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2015
            Transcript show:'try for: '; showCR:nodeReceiver
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
        bestSelectors := self findBest:nodeReceiver for:selector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2018
                              inClasses:classesOfReceiver
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2019
    ] ifFalse:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2020
        bestSelectors := OrderedCollection new.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2021
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2022
 
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2023
    "/ if the receiver is a real variable,
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  2024
    "/ 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
  2025
    "/ 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
  2026
    (tree notNil
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2027
        and:[ nodeReceiver isVariable
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2028
        and:[ nodeReceiver isSelf not
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2029
        and:[ nodeReceiver isSuper not ]]])
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2030
    ifTrue:[
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2031
        |receiverName possibleClasses possibleClassesFromOtherSends|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2032
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2033
        receiverName := nodeReceiver name.
5486
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2034
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2035
        classesOfReceiver notEmptyOrNil ifTrue:[ 
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2036
            possibleClasses := classesOfReceiver.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2037
        ] ifFalse:[    
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2038
            classesFromAssignmentsToReceiver := self classesFromAssignmentTo:receiverName in:tree.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2039
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2040
            possibleClasses := classesFromAssignmentsToReceiver.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2041
            possibleClasses isEmpty ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2042
                "/ messages sent
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2043
                otherMessagesToReceiver := self messagesSentTo:receiverName in:tree.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2044
                otherMessagesToReceiver remove:selector ifAbsent:[].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2045
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2046
                otherMessagesToReceiver notEmpty ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2047
                    "/ classes which respond to all
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2048
                    possibleClassesFromOtherSends :=
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2049
                        Smalltalk 
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2050
                            allClassesForWhich:[:cls |
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2051
                                cls isLoaded
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2052
                                and:[ otherMessagesToReceiver
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2053
                                        conform:[:eachSelectorSent | cls canUnderstand:eachSelectorSent]]
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2054
                            ].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2055
                    possibleClasses := possibleClasses , possibleClassesFromOtherSends.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2056
                ].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2057
            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2058
 
5486
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2059
            "/ if the receiver is a classVar/classInstVar,
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2060
            "/ include the class of its current value and UndefinedObject.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2061
            "/ This helps to complete class methods and (lazy) initializer code.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2062
            (classOrNil notNil) ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2063
                |tryValue currentValue|
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2064
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2065
                tryValue := false.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2066
                (classOrNil theNonMetaclass allClassVarNames includes: receiverName) ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2067
                    tryValue := true.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2068
                    currentValue := classOrNil theNonMetaclass classVarAt:receiverName.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2069
                ] ifFalse:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2070
                    (classOrNil isMeta and:[ classOrNil allInstVarNames includes: receiverName ]) ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2071
                        tryValue := true.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2072
                        currentValue := classOrNil theNonMetaclass instVarNamed:receiverName.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2073
                    ].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2074
                ].
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2075
                tryValue ifTrue:[
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2076
                    possibleClasses := { currentValue class } , possibleClasses.
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2077
                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2078
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2079
        ].
5486
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  2080
        
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2081
        (possibleClasses notEmpty and:[possibleClasses size < 15]) ifTrue:[
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2082
            bestSelectors :=
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2083
                (possibleClasses 
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2084
                    collectAll:[:eachClass |
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2085
                        Parser findBest:30 selectorsFor:selector in:eachClass forCompletion:true.
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2086
                    ] as:Set) asOrderedCollection.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2087
 
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2088
            "/ if any of those is a prefix-keyword of the selector,
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2089
            "/ do not offer it (i.e. ifTrue:ifFalse: is already present, don't offer ifTrue:ifFalse: again.
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2090
            bestSelectors := bestSelectors reject: [:sel | (selector startsWith: sel) or: [selector endsWith: sel]].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2091
        ].
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2092
    ].                                                                            
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2093
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2094
    "/ if we are behind a keyword messages colon,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2095
    "/ only look for matching prefix selectors;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2096
    "/ also, a good completion is to insert an argument;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2097
    "/ 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
  2098
    "/ Array new:1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2099
    selector isKeyword ifTrue:[
5385
730032499904 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5379
diff changeset
  2100
        (node arguments size = selector argumentCount) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2101
            offerParenthisationAroundNode := node. 
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2102
            "/ Transcript show:'2:'; showCR:node.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2103
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2104
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2105
        codeView characterBeforeCursor == $: ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2106
            (bestSelectors select:[:sel | sel asLowercase startsWith:lcSelector]) isEmpty ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2107
                "/ nothing better around
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2108
                |argIndex argNames argNameStrings impls|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2109
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2110
                argIndex := node selectorParts size.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2111
                argNames := Set new.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2112
                argNameStrings := OrderedCollection new.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2113
                impls := Smalltalk allImplementorsOf:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2114
                impls size < 10 ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2115
                    impls do:[:eachImplClass |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2116
                        |mthd argName|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2117
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2118
                        mthd := (eachImplClass compiledMethodAt:selector).
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2119
                        argName := (mthd methodArgNames ? #()) at:argIndex ifAbsent:nil.
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2120
                        argName notNil ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2121
                            (argNames includes:argName) ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2122
                                argNames add:argName.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2123
                                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
  2124
                            ].    
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2125
                        ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2126
                    ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2127
                    argNameStrings notEmptyOrNil ifTrue: [
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2128
                        argNameStrings := argNameStrings asOrderedCollection sort.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2129
                        actionBlock value:argNameStrings value:[:selIndex | ] value: 'argument name hint'.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2130
                        ^ self.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2131
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2132
                ]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2133
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2134
        ].
4369
810a78e62f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  2135
    ] ifFalse:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2136
        "/ 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
  2137
        "/ only consider longer keyword messages or unary messages.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2138
        "/ unless the node is parenthesized
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2139
        node hasParentheses ifFalse:[ 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2140
            (parentNode notNil and:[ parentNode isKeywordMessage ]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2141
                bestSelectors := bestSelectors select:[:sel | sel isUnarySelector or:[ sel startsWith:sel]]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2142
            ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2143
        ]
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2144
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2145
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2146
"/    bestSelectors := bestSelectors asOrderedCollection.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2147
"/    bestSelectors sort:[:a :b | a size < b size].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2148
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2149
    (selector isUnarySelector and:[ parentNode notNil and:[ parentNode isMessage ]]) ifTrue:[
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2150
        (parentSelector := parentNode selector) isKeyword ifTrue:[
5471
289b60e70a2c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5462
diff changeset
  2151
            "/ 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
  2152
            "/ 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
  2153
            newParentSelector := parentSelector,selector.
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2154
            bestSelectors2 := self 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2155
                                findBest:(parentNode receiver) for:newParentSelector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2156
                                inClasses:(self classesOfNode:parentNode receiver).
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2157
            bestSelectors2 := bestSelectors2 select:[:sel | sel isKeyword and:[ sel startsWith:parentSelector]].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2158
            bestSelectors2 := bestSelectors2 asOrderedCollection sort:[:a :b | a size < b size].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2159
            bestSelectors := bestSelectors reject:[:sel | bestSelectors2 includes:sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2160
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2161
            "/ if the parent has a valid selector, offer parenthization
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2162
            (Smalltalk someImplementorOf:parentSelector) notNil ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2163
                offerParenthisationAroundNode := parentNode.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2164
                "/ Transcript show:'2:'; showCR:parentNode.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2165
            ].
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2166
            parentSelector := newParentSelector.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2167
        ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2168
            |kwSels|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2169
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2170
            "/ 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
  2171
            "/ try again, sending the partial message
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2172
            "/ as a keyword to the parent node.
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2173
            "/ 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
  2174
            "/ which should include ifTrue: in the suggestion result.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2175
            
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2176
            "/ suggestion will transform from (the incorrectly parsed)
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2177
            "/    foo == (shift if)
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2178
            "/
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2179
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2180
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2181
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2182
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2183
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2184
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2185
            "/           arg
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2186
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2187
            "/ into:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2188
            "/    (foo == shift) if
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2189
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2190
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2191
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2192
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2193
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2194
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2195
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2196
            "/           arg
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2197
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2198
            "/ 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
  2199
            "/ (i.e. after (foo == shift) <-
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2200
            "/    or after foo bar baz <-
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2201
            "/ not if typing into an existing message
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2202
            "/ (i.e. into foo == shift <- more
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2203
            "/    or into foo bar <- baz
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2204
            codeView characterPositionOfCursor >= parentNode stop ifTrue:[
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2205
                kwSels := self 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2206
                                findBest:parentNode for:selector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2207
                                inClasses:(self classesOfNode:parentNode).
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2208
                kwSels := kwSels select:[:sel | sel isKeyword].
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2209
     
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2210
                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
  2211
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2212
                bestSelectors := bestSelectors reject:[:sel | kwSels includes:sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2213
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2214
                "/ these need to go to bestSelectors (see editAction)
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2215
                parentNodeClassIfKnown := self classOfNode:parentNode.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2216
                (parentNodeClassIfKnown notNil and:[ parentNodeClassIfKnown includesBehavior: Boolean ]) ifTrue:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2217
                    "/ this is so common, that it deserves a special case:
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2218
                    "/ 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
  2219
                    "/ 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
  2220
                    bestSelectors := self
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2221
                                        withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2222
                                        from:bestSelectors
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2223
                                        forPartial:selector.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2224
                    kwSels := self
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2225
                                withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2226
                                from:kwSels
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2227
                                forPartial:selector.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2228
     
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2229
                    "/ put keyword selectors in front, because they are very likely
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2230
                    bestSelectors := kwSels , bestSelectors.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2231
                ] ifFalse:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2232
                    "/ put them at the end
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2233
                    bestSelectors := bestSelectors , kwSels.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2234
                ].
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2235
            ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2236
        ]
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2237
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2238
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2239
    (selector isUnarySelector and:[ node isMessage ]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2240
        receiverNodeClassIfKnown := self classOfNode:nodeReceiver.
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2241
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2242
        (receiverNodeClassIfKnown notNil) ifTrue:[
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2243
            true "(receiverNodeClassIfKnown includesBehavior: Boolean)" ifTrue:[
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2244
                bestSelectors := bestSelectors select:[:sel | receiverNodeClassIfKnown canUnderstand:sel].
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2245
                bestSelectors := self
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2246
                                    withoutSelectorsUnlikelyFor:receiverNodeClassIfKnown
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2247
                                    from:bestSelectors
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2248
                                    forPartial:selector.
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  2249
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2250
        ].
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  2251
    ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2252
    
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2253
    Verbose == true ifTrue:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2254
        Transcript show:'parentNode: '; showCR:parentNode.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2255
        Transcript show:'parentNode: '; showCR:parentNode class.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2256
        Transcript show:'sel: '; showCR:selector.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2257
    ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2258
    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2259
    canParenthesize := false.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2260
    parentNode notNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2261
        parentNode isMessage ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2262
            (((parentNode selector isUnarySelector not) and:[selector isUnarySelector])
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2263
            or:[ ((parentNode selector isKeyword) and:[selector isBinarySelector]) ]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2264
                canParenthesize := true.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2265
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2266
        ] ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2267
            offerParenthisationAroundNode isNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2268
                selector isKeyword ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2269
                    offerParenthisationAroundNode := node.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2270
                ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2271
            ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2272
        ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2273
    ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2274
    canParenthesize ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2275
        "/ 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
  2276
        "/ if, and, or or while.
5203
9b8272cc6d49 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5146
diff changeset
  2277
        "/ 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
  2278
        "/ 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
  2279
        "/    expr wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2280
        "/ ->
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2281
        "/    [expr] whileXX:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2282
        true "((
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2283
            #( '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
  2284
        ) contains:[:part | part startsWith:selector])" ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2285
            (Smalltalk someImplementorOf:parentNode selector) notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2286
                |selsP selsB|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2287
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2288
                selsP := #( 'ifTrue:' 'ifFalse:' 'and' 'or' 'do' 'keysAndValuesDo' )
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2289
                            select:[:sel | sel startsWith:selector]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2290
                            thenCollect:[:sel | '(',parentNode selector,') ',sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2291
                ( #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' ) contains:[:sel | sel startsWith:selector]) 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2292
                ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2293
                    selsP := selsP copyWith:'(',parentNode selector,') ',selector  
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2294
                ]. 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2295
                selsB := #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' )
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2296
                            select:[:sel | sel startsWith:selector]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2297
                            thenCollect:[:sel | '[',parentNode selector,'] ',sel].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2298
                parentNodeToParenthesize := parentNode.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2299
                bestWithParenthesis := selsP , selsB.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2300
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2301
        ].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  2302
    ] ifFalse:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2303
        "/ also offer adding brackets for a while expression
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2304
        "/    expr wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2305
        "/ ->
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2306
        "/    [expr] whileXX:[]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2307
        ((
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2308
            #( 'whileTrue' 'whileFalse' 'ensure' 'on')
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2309
        ) contains:[:part | part startsWith:selector]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2310
            (node receiver isBlock) ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2311
                |sels|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2312
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2313
                (node receiver isMessage not
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2314
                or:[ (Smalltalk someImplementorOf:node receiver selector) notNil ]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2315
                    sels := #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' )
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2316
                                select:[:sel | sel startsWith:selector]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2317
                                thenCollect:[:sel | '[...] ',sel].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2318
                    parentNodeToParenthesize := node receiver.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2319
                    bestWithParenthesis := sels.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2320
                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2321
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2322
        ].
4416
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2323
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2324
 
5419
7ba6ce8016c2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5392
diff changeset
  2325
    allBest := (bestSelectors ? #()) , (bestSelectors2 ? #()) asOrderedCollection.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2326
    self sortSelectors:allBest forSelector:selector lcSelector:lcSelector.
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2327
                        
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2328
    "/ sort: prefixes first.
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2329
    parentSelector notNil ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2330
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2331
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2332
                    by:[:sel | 
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  2333
                            (sel asLowercase startsWith:lcSelector) 
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2334
                            or:[sel startsWith:parentSelector]].
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2335
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2336
 
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2337
    "/ if receiver is super, always include the method's own selector
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  2338
    nodeReceiver isSuper ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2339
        (tree isMethod) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2340
            |mSel|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2341
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2342
            mSel := tree selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2343
            mSel notNil ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2344
                (mSel startsWith:selector) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2345
                    "/ already the word before the cursor?
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2346
                    (mSel ~= selector) ifTrue:[
5419
7ba6ce8016c2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5392
diff changeset
  2347
                        allBest removeAndAddFirst:mSel.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2348
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2349
                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2350
            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2351
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2352
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2353
 
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2354
    "/ another convenient hack; 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2355
    "/ if we have just typed in foo == 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2356
    "/ and the value of foo is a known literal,
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2357
    "/ offer inserting this literal. This is great in a debugger...
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2358
    ( #(#'==' #'=' #'~=' #'~~') includes:selector ) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2359
        |val|
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2360
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2361
        (val := self valueOfNode:nodeReceiver) notNil ifTrue:[
5285
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2362
            "/ 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
  2363
            "/ (it is recursive, or an X11GraphicsContext, for example)
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2364
            Error handle:[:ex |
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2365
            ] do:[
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2366
                valueToInsert := val storeString.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2367
                offerValueInsertion := true.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2368
                nodeReceiver isVariable ifTrue:[
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2369
                    valueInfo := ' (current value of %1)' bindWith:nodeReceiver name.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2370
                ] ifFalse:[                
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2371
                    valueInfo := ' (current value of expression)'.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2372
                ].
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2373
                valueInfo := valueInfo withColor:(Color grey).
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2374
            ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2375
        ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2376
    ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2377
    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2378
    (allBest isEmptyOrNil 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2379
        and:[bestWithParenthesis isEmptyOrNil
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2380
        and:[offerParenthisationAroundNode isNil
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2381
        and:[offerValueInsertion not]]] 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2382
    ) ifTrue:[ 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2383
        ^ self 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2384
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2385
 
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2386
"/    "/ 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
  2387
"/    "/ and also what is assigned to it.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2388
"/    nodeReceiver notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2389
"/        nodeReceiver isVariable ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2390
"/            rememberedNodes notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2391
"/                selectorsSentInCode := 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2392
"/                    (rememberedNodes
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2393
"/                        select:[:node | 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2394
"/                            node isMessage 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2395
"/                                and:[node receiver isVariable
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2396
"/                                and:[node receiver name = nodeReceiver name]]]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2397
"/                        thenCollect:[:node | 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2398
"/                            node selector]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2399
"/                    ) asSet.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2400
"/            ] ifFalse:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2401
"/                selectorsSentInCode := Set new. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2402
"/                tree allMessageNodesDo:[:msg |
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2403
"/                    (msg receiver isVariable
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2404
"/                        and:[msg receiver name = nodeReceiver name]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2405
"/                    ) ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2406
"/                        selectorsSentInCode add:msg selector
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2407
"/                    ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2408
"/                ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2409
"/                selectorsSentInCode remove:selector ifAbsent:[].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2410
"/            ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2411
"/        ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2412
"/    ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2413
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2414
    nodeReceiver notNil ifTrue:[
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2415
        |classOrNil|
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2416
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2417
        classOrNil := self classOfNode:nodeReceiver.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2418
        classOrNil isNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2419
            classesFromAssignmentsToReceiver size == 1 ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2420
                classOrNil := classesFromAssignmentsToReceiver anElement
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2421
            ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2422
        ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2423
        classOrNil notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2424
            selectorsImplementedInClass := classOrNil selectors.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2425
"/            selectorsImplementedInClass := Set new.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2426
"/            classOrNil withAllSuperclassesDo:[:cls |
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2427
"/                cls theNonMetaclass ~~ Object ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2428
"/                    selectorsImplementedInClass addAll:cls selectors.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2429
"/                ]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2430
"/            ]    
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2431
        ]
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  2432
    ].    
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2433
    selectorsImplementedInClass notNil ifTrue:[
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2434
        (parentSelector notNil and:[parentSelector includes:$:]) ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2435
            selectorsImplementedInClass := selectorsImplementedInClass reject:[:sel | sel isKeywordSelector].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2436
        ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2437
        
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2438
        "/ 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
  2439
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2440
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2441
                    by:[:sel | selectorsImplementedInClass includes:sel].
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2442
    ].
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2443
    otherMessagesToReceiver "selectorsSentInCode" notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2444
        "/ 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
  2445
        "/ 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
  2446
        "/ selectors sent previously. sigh.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2447
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2448
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2449
                    by:[:sel | otherMessagesToReceiver "selectorsSentInCode" includes:sel].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2450
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2451
 
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2452
    (parentSelector notNil and:[parentSelector includes:$:]) ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2453
        allBest := self 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2454
                    splitSelectorList:allBest 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2455
                    by:[:sel | sel startsWith:parentSelector].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2456
    ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2457
    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2458
"/ this makes it very slow
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2459
"/false ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2460
"/    srchClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2461
"/        implClass := srchClass whichClassIncludesSelector:best.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2462
"/    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2463
"/        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
  2464
"/        implClass size == 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2465
"/            implClass := implClass first.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2466
"/        ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2467
"/            implClass := nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2468
"/        ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2469
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2470
"/
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2471
"/    info := best storeString.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2472
"/    implClass notNil ifTrue:[
5505
485ae56088f2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5504
diff changeset
  2473
"/        info := implClass name , ' » ' , info.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2474
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2475
"/    self information:info.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2476
"/].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2477
 
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2478
    (parentSelector notNil and:[parentSelector includes:$:]) ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2479
        "/ 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
  2480
        allBest := self splitSelectorList:allBest 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2481
                        by:[:sel | sel notNil and:[sel asLowercase startsWith:lcSelector]].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2482
    ].
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2483
    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2484
    "/ heuristic hack:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2485
    "/ '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
  2486
    "/ we know, that those are most often wanted!!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2487
    selector size <= 2 ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2488
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2489
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2490
                    by:[:sel | 
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2491
                        #(ifTrue: ifFalse: isNil notNil whileTrue whileFalse) includes:sel
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2492
                    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2493
    ]. 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2494
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2495
    self sortUsefulSelectorsIn:allBest. "/cosmetics
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2496
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2497
    (parentSelector notNil and:[parentSelector includes:$:]) ifTrue:[
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2498
        allBest := (allBest 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2499
                        select:[:sel | sel startsWith:parentSelector]
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2500
                        thenCollect:[:sel | sel copyFrom:(parentSelector lastIndexOf:$:)+1])
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2501
                    ,
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2502
                    (allBest 
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2503
                        reject:[: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
    "/ parenthesizers always at the end.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2507
    bestWithParenthesis notEmptyOrNil ifTrue:[ 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2508
        allBest := allBest , bestWithParenthesis.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2509
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2510
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2511
    "/ self at:1 put:#foo
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2512
    "/ Array new:10
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2513
    offerParenthisationAroundNode notNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2514
        allBest := allBest copyWith:( '(',selector,')' ).
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2515
        parenthesisAroundIndex := allBest size.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2516
    ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2517
    offerValueInsertion ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2518
        allBest := allBest copyWith:( '... ',(valueToInsert contractTo:30),valueInfo). 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2519
        valueToInsertIndex := allBest size.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2520
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2521
 
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2522
    editAction :=
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2523
        [:index |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2524
            |crsrPos chosen parenthesisToInsert action|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2525
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2526
            action := nil.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2527
            crsrPos := codeView characterPositionOfCursor.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2528
            chosen := allBest at:index.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2529
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2530
            chosen ~= selector ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2531
                (bestWithParenthesis notNil and:[bestWithParenthesis includes:chosen]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2532
                    "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2533
                    "/   chosen at: 10 if
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2534
                    "/ put parenthesis around, and add ifTrue/ifFalse
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2535
                    "/ i.e.:   (chosen at:10) ifTrue:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2536
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2537
                    "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2538
                    "/   a > 10 wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2539
                    "/ put brackets around and add whileTrue/whileFalse
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2540
                    "/ i.e.:   [a > 10] whileTrue:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2541
                    parenthesisToInsert := chosen first == $( ifTrue:'()' ifFalse:'[]'.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2542
                    chosen := (chosen copyFrom:(chosen lastIndexOf:parenthesisToInsert second)+1) withoutSeparators.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2543
                ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2544
                    (offerParenthisationAroundNode notNil and:[index = parenthesisAroundIndex]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2545
                        "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2546
                        "/      Array new:10
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2547
                        "/ put parenthesis around.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2548
                        "/ i.e.:   (Array new:10)
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2549
                        action :=
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2550
                            [
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2551
                                codeView insertString:'(' atCharacterPosition:offerParenthisationAroundNode start.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2552
                                codeView insertString:')' atCharacterPosition:offerParenthisationAroundNode stop+2.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2553
                                codeView cursorToCharacterPosition:(offerParenthisationAroundNode stop+2); cursorRight.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2554
                            ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2555
                    ] ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2556
                        (offerValueInsertion and:[index = valueToInsertIndex]) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2557
                            "/ for input like: 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2558
                            "/      foo == 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2559
                            "/ insert a value
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2560
                            "/ i.e.:   foo == #someSymbol
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2561
                            action :=
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2562
                                [
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2563
                                    codeView characterBeforeCursor isSeparator ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2564
                                        codeView insertStringAtCursor:' '.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2565
                                    ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2566
                                    codeView insertStringAtCursor:valueToInsert.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2567
                                    "/ codeView cursorRight.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2568
                                ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2569
                        ]
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2570
                    ].    
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2571
                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2572
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2573
                action isNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2574
                    numArgs := chosen numArgs.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2575
                    (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:chosen]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2576
                        selectorParts := parentNode selectorParts , node selectorParts.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2577
                    ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2578
                        selectorParts := node selectorParts.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2579
                    ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2580
                    nSelParts := selectorParts size.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2581
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2582
                    newParts := chosen asCollectionOfSubstringsSeparatedBy:$:.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2583
                    newParts := newParts select:[:part | part size > 0].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2584
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2585
                    action :=
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2586
                        [
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2587
                            |positionOfFirstArg newCursorPosition stop checkForArgumentTemplates
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2588
                             newPart oldPartialToken start|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2589
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2590
                            checkForArgumentTemplates := (selector isUnarySelector and:[chosen isKeywordSelector]).
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2591
                            numArgs > nSelParts ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2592
                                "/ new selector has more arguments; append them
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2593
                                stop := selectorParts last stop.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2594
                                codeView deleteFromCharacterPosition:stop+1 to:crsrPos-1.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2595
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2596
                                "/ append the rest ...
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2597
                                (numArgs min:newParts size) downTo:(nSelParts+1) do:[:idx |
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2598
                                    |newPart|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2599
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2600
                                    newPart := newParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2601
                                    newPart := newPart , ':'.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2602
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2603
                                    (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2604
                                        newPart := ':' , newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2605
                                    ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2606
                                    newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2607
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2608
                                    codeView replaceFromCharacterPosition:stop to:stop with:newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2609
                                    "/ remember the leftMost replacement's end as new cursor position
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2610
                                    newCursorPosition := stop + newPart size
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2611
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2612
                                checkForArgumentTemplates := true.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2613
                            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2614
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2615
                            "/ replace existing parts
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2616
                            (nSelParts min:newParts size) downTo:1 do:[:idx |
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2617
                                |skipColon|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2618
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2619
                                skipColon := 0.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2620
                                newPart := newParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2621
                                oldPartialToken := selectorParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2622
                                start := oldPartialToken start.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2623
                                stop := oldPartialToken stop.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2624
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2625
                                (chosen endsWith:$:) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2626
                                    (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2627
                                        newPart := newPart , ':'.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2628
                                    ] ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2629
                                        skipColon := 1.
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
                                ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2632
                                    (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2633
                                        newPart := newPart , ':'
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2634
                                    ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2635
                                        |nextChar|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2636
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2637
                                        nextChar := codeView characterAtCharacterPosition:stop+1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2638
                                        nextChar isSeparator ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2639
                                            nextChar == $. ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2640
                                                newPart := newPart , ' '
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2641
                                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2642
                                        ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2643
                                    ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2644
            "/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2645
            "/                        ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2646
            "/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2647
                                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2648
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2649
                                oldPartialToken value ~= newPart ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2650
                                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2651
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2652
                                    oldLen := stop - start + 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2653
                                    newLen := newPart size.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2654
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2655
                                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2656
                                    "/ remember the leftMost replacement's end as new cursor position
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2657
                                    newCursorPosition := start + newPart size + skipColon. "/ (newLen-oldLen) + 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2658
                                    "/ codeView cursorToCharacterPosition:newCursorPosition.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2659
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2660
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2661
                            newCursorPosition notNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2662
                                codeView cursorToCharacterPosition:newCursorPosition-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2663
                                codeView cursorRight.  "/ avoid going to the next line !!
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2664
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2665
                            codeView dontReplaceSelectionOnInput.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2666
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2667
                            checkForArgumentTemplates ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2668
                                "/ add opening brackets, etc.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2669
                                self insertAdditonalStuffAfterSelector:chosen.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2670
                            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2671
                            parenthesisToInsert notNil ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2672
                                |sav pos|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2673
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2674
                                sav := codeView characterPositionOfCursor-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2675
                                "/ check if already parenthized
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2676
                                parentNodeToParenthesize hasParentheses ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2677
                                    pos := parentNodeToParenthesize parentheses first first.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2678
                                    codeView selectFromCharacterPosition:pos to:pos.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2679
                                    codeView replaceSelectionBy:(parenthesisToInsert copyFirst:1) asString.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2680
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2681
                                    pos := parentNodeToParenthesize parentheses first last.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2682
                                    codeView selectFromCharacterPosition:pos to:pos.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2683
                                    codeView replaceSelectionBy:(parenthesisToInsert copyLast:1) asString.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2684
                                    codeView cursorToCharacterPosition:sav; cursorRight
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2685
                                ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2686
                                    codeView insertString:(parenthesisToInsert copyLast:1) atCharacterPosition:node receiver stop+1.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2687
                                    codeView insertString:(parenthesisToInsert copyFirst:1) atCharacterPosition:parentNodeToParenthesize start.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2688
                                    codeView cursorToCharacterPosition:sav+2; cursorRight
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2689
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2690
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2691
                        ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2692
                    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2693
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2694
                codeView
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2695
                    undoableDo:action
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2696
                    info:'Completion'.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2697
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2698
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2699
    actionBlock value:allBest value:editAction value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2700
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2701
    "Created: / 10-11-2006 / 13:18:27 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2702
    "Modified: / 16-02-2010 / 10:33:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  2703
    "Modified: / 08-04-2017 / 16:29:29 / cg"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2704
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2705
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2706
codeCompletionForMessageTo:node into:actionBlock
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2707
    "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
  2708
     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
  2709
    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2710
    |knownClass suggestions selectorsImplementedInClass mostUseful editActions pos|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2711
 
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2712
    (knownClass := self classOfNode:node) isNil ifTrue:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2713
        self breakPoint:#cg.
5113
6a5ae22ee501 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5112
diff changeset
  2714
        "/ self classOfNode:node.
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2715
        ^ self
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2716
    ].
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2717
    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2718
    Verbose == true ifTrue:[ 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2719
        Transcript show:node; show:' -> '; showCR:knownClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2720
    ].    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2721
    selectorsImplementedInClass := Set new.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2722
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2723
    knownClass withAllSuperclassesDo:[:cls |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2724
        cls ~~ Object ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2725
            selectorsImplementedInClass addAll:cls selectors.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2726
        ]    
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2727
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2728
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2729
    knownClass isMeta ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2730
        selectorsImplementedInClass := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2731
            selectorsImplementedInClass reject:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2732
                |mthd|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2733
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2734
                mthd := knownClass lookupMethodFor:sel.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2735
                mthd notNil and:[mthd category startsWith: 'documentation']
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2736
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2737
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2738
        knownClass theNonMetaclass isAbstract ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2739
            mostUseful := selectorsImplementedInClass select:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2740
                            knownClass implements:sel
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2741
                          ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2742
        ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2743
            mostUseful := selectorsImplementedInClass select:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2744
                                |mthd|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2745
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2746
                                mthd := knownClass lookupMethodFor:sel.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2747
                                mthd notNil and:[mthd category startsWith: 'instance']
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2748
                          ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2749
        ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2750
    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2751
        mostUseful := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2752
            #(
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2753
                "/ blocks
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2754
                ifTrue: ifFalse: whileTrue: whileFalse: on:do: ensure: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2755
                whileTrue whileFalse loop
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2756
                "/ any
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2757
                isNil notNil isEmpty notEmpty 
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
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2760
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2761
    mostUseful notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2762
        suggestions := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2763
            (selectorsImplementedInClass select:[:sel | mostUseful includes:sel]) asNewOrderedCollection sort
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2764
            ,
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2765
            (selectorsImplementedInClass reject:[:sel | mostUseful includes:sel]) asNewOrderedCollection sort.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2766
    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2767
        suggestions := selectorsImplementedInClass asNewOrderedCollection sort.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2768
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2769
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2770
    suggestions := suggestions reject:[:sel | sel first == $_].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2771
    self sortUsefulSelectorsIn:suggestions. "/cosmetics
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2772
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2773
    pos := codeView characterPositionOfCursor.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2774
    editActions := suggestions collect:[:word |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2775
                        self editActionToReplaceCodeFrom:pos to:pos-1 by:word.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2776
                   ].                
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2777
    actionBlock value:suggestions value:editActions value:nil.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2778
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2779
    "Created: / 01-05-2016 / 17:01:21 / cg"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2780
    "Modified: / 01-05-2016 / 18:54:03 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2781
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2782
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2783
codeCompletionForMethodSpec:node
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2784
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2785
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2786
    self
5312
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2787
        codeCompletionForMethodSpec:node
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2788
        into:
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2789
            [:suggestions :action :whatIsIt |
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2790
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2791
            |chosen|
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2792
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2793
            chosen := self askUserForCompletion:whatIsIt for:codeView
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2794
                           at:node start from:suggestions.
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2795
            chosen notNil ifTrue:[
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2796
                action value:(suggestions indexOf:chosen)
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2797
            ].
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2798
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2799
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2800
"/    |crsrPos
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2801
"/     selectorSoFar matchingSelectors
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2802
"/     selectors distances best rest
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2803
"/     allExistingMethods nameBag namesByCount selectors1 selectors2|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2804
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2805
"/    crsrPos := codeView characterPositionOfCursor - 1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2806
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2807
"/    selectorSoFar := ''.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2808
"/    node selectorParts doWithIndex:[:partToken :argNr|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2809
"/        |part|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2810
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2811
"/        part := partToken value.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2812
"/        selectorSoFar := selectorSoFar , part.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2813
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2814
"/        (crsrPos >= partToken start
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2815
"/        and:[crsrPos <= partToken stop]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2816
"/            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2817
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2818
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2819
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2820
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2821
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2822
"/                                        md := eachClass theMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2823
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2824
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2825
"/                                    ].
5312
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2826
"/                "/ don't forget the stuff in the class-line
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2827
"/                Metaclass withAllSuperclassesDo:[:cls |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2828
"/                    matchingSelectors addAll:(cls methodDictionary keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2829
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2830
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2831
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2832
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2833
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2834
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2835
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2836
"/                                        md := eachClass theNonMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2837
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2838
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2839
"/                                    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2840
"/            ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2841
"/            selectors := matchingSelectors asOrderedCollection.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2842
"/
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2843
"/            "/ 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
  2844
"/            (selectors size == 1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2845
"/            and:[selectors first = selectorSoFar]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2846
"/                selectorSoFar numArgs == 0 ifTrue:[ ^ self ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2847
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2848
"/                allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2849
"/                                        collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2850
"/                nameBag := Bag new.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2851
"/                allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2852
"/                namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2853
"/                "/ take the one which occurs most often
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2854
"/                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
  2855
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2856
"/                codeView
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2857
"/                    undoableDo:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2858
"/                        (crsrPos+1) >= codeView contents size ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2859
"/                            codeView paste:best.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2860
"/                        ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2861
"/                            codeView insertString:best atCharacterPosition:crsrPos+1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2862
"/                        ]
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
"/                    info:'completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2865
"/                codeView cursorToCharacterPosition:(crsrPos + best size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2866
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2867
"/                "the ones implemented in superclasses are shown first"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2868
"/                classOrNil notNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2869
"/                    selectors1 := selectors select:[:sel | classOrNil respondsTo:sel].  "/ in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2870
"/                    selectors2 := selectors reject:[:sel | selectors1 includes:sel ].   "/ not in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2871
"/                ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2872
"/                    selectors1 := selectors
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2873
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2874
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2875
"/                distances := selectors1 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2876
"/                distances sortWith:selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2877
"/                selectors1 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2878
"/                selectors := selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2879
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2880
"/                selectors2 notEmptyOrNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2881
"/                    distances := selectors2 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2882
"/                    distances sortWith:selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2883
"/                    selectors2 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2884
"/                    selectors1 := selectors1 collect:[:sel | sel allBold].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2885
"/                    selectors := selectors1,selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2886
"/                ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2887
"/
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2888
"/                best := self askUserForCompletion:'selector' for:codeView at:(node start) from:selectors.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2889
"/                best isNil ifTrue:[^ self].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2890
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2891
"/                rest := best copyFrom:selectorSoFar size.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2892
"/                codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2893
"/                    undoableDo:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2894
"/                        codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2895
"/                            replaceFromCharacterPosition:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2896
"/                            to:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2897
"/                            with:rest
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2898
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2899
"/                    info:'Completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2900
"/                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2901
"/            ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2902
"/            codeView cursorRight. "/ kludge to make it visible
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2903
"/        ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2904
"/    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2905
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2906
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2907
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2908
    "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
  2909
    "Modified: / 01-06-2012 / 20:31:36 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2910
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2911
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2912
codeCompletionForMethodSpec:node into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2913
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2914
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2915
    |crsrPos crsrLine crsrCol
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2916
     selectorSoFar matchingSelectors
5146
1bc2c5c6fc91 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 5143
diff changeset
  2917
     selectors allExistingMethods nameBag namesByCount 
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2918
     allSelectors
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2919
     selectorsForIsXXXTests selectorsSentInClass selectorsImplementedInSuper 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2920
     editAction editActionForArg argNames selectorsForVars
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2921
     selectorTypedSoFar addIfNotYetImplemented alreadyOK|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2922
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2923
    allSelectors := Set new.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2924
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2925
    "/ Transcript showCR:'m'.
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2926
    crsrLine := codeView cursorLine.
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2927
    crsrCol := codeView cursorCol.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2928
    crsrPos := codeView characterPositionOfCursor - 1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2929
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2930
    selectorTypedSoFar := node selector.
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2931
    selectorTypedSoFar isUnarySelector ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2932
        "/ user has just begun to edit a selector.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2933
        "/ 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
  2934
        classOrNil notNil ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2935
            selectorsForVars := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2936
            selectorsImplementedInSuper := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2937
            selectorsSentInClass := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2938
            selectorsForIsXXXTests := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2939
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2940
            addIfNotYetImplemented :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2941
                [:list :sel |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2942
                    sel ~= selectorTypedSoFar ifTrue:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2943
                        (allSelectors includes:sel) ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2944
                            (classOrNil implements:sel asSymbol) ifFalse:[ 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2945
                                selectorsForVars add:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2946
                                allSelectors add:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2947
                            ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2948
                        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2949
                    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2950
                ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2951
                
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2952
            classOrNil instVarNames do:[:nm |
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2953
                (nm startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2954
                    addIfNotYetImplemented value:selectorsForVars value:nm.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2955
                    addIfNotYetImplemented value:selectorsForVars value:(nm,':').
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2956
                 ]
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2957
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2958
            classOrNil isMeta ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2959
                classOrNil theNonMetaclass classVarNames do:[:nm |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2960
                    |nmSel|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2961
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2962
                    nmSel := nm asLowercaseFirst.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2963
                    (nmSel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2964
                        addIfNotYetImplemented value:selectorsForVars value:nmSel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2965
                        addIfNotYetImplemented value:selectorsForVars value:(nmSel,':').
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2966
                    ]
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2967
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2968
            ] ifFalse:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2969
                "/ isXXX ?
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2970
                (('is',classOrNil nameWithoutPrefix) startsWith:selectorTypedSoFar ) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2971
                    addIfNotYetImplemented value:selectorsForIsXXXTests value:('is',classOrNil nameWithoutPrefix).
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2972
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2973
            ].
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2974
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2975
            "/ and also messages sent by the class itself
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2976
            classOrNil methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2977
                m messagesSentToSelf do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2978
                    (sel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2979
                        addIfNotYetImplemented value:selectorsSentInClass value:sel.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2980
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2981
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2982
            ].
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2983
            classOrNil isMeta ifFalse:[
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2984
                classOrNil theMetaclass methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2985
                    m messagesSent do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2986
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2987
                            addIfNotYetImplemented value:selectorsSentInClass value:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2988
                        ]                     
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2989
                    ]                     
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2990
                ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2991
            ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2992
            "/ and also messages implemented by superclasses (except Object)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2993
            classOrNil allSuperclassesDo:[:eachSuperclass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2994
                eachSuperclass ~~ Object ifTrue:[
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  2995
                    eachSuperclass selectorsDo:[:sel |
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2996
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2997
                            addIfNotYetImplemented value:selectorsImplementedInSuper value:sel.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2998
                        ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2999
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3000
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  3001
            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3002
        ].
4371
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  3003
    ].
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  3004
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3005
    selectorSoFar := ''.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3006
    matchingSelectors := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3007
    
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3008
    node selectorParts doWithIndex:[:partToken :argNr|
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3009
        |part|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3010
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3011
        part := partToken value.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3012
        selectorSoFar := selectorSoFar , part.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3013
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3014
        (crsrPos >= partToken start 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3015
            and:[crsrPos <= partToken stop
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3016
                 or:[ (crsrPos == (partToken stop+1))
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3017
                      and:[codeView characterBeforeCursor == Character space]] ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3018
        ) ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3019
            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3020
                Smalltalk 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3021
                    allClassesDo:[:eachClass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3022
                        |md|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3023
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3024
                        md := eachClass theMetaclass methodDictionary.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3025
                        matchingSelectors addAll:(md keys 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3026
                                                    select:[:sel |sel startsWith:selectorSoFar]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3027
                    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3028
                "/ do not forget the stuff in the class-line
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3029
                Metaclass withAllSuperclassesDo:[:cls |
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3030
                    matchingSelectors addAll:(cls methodDictionary keys 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3031
                                                select:[:sel |sel startsWith:selectorSoFar]).
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3032
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3033
            ] ifFalse:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3034
                Smalltalk 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3035
                    allClassesDo:[:eachClass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3036
                        |md|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3037
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3038
                        md := eachClass theNonMetaclass methodDictionary.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3039
                        matchingSelectors addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3040
                    ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3041
            ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3042
        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3043
    ].  
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3044
    alreadyOK := matchingSelectors includes:selectorTypedSoFar.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3045
    matchingSelectors remove:selectorTypedSoFar ifAbsent:[].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3046
    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3047
    selectors := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3048
    selectors addAll:matchingSelectors.
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
    selectorsForVars notNil ifTrue:[ selectors addAll:selectorsForVars ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3051
    selectorsSentInClass notNil ifTrue:[ selectors addAll:selectorsSentInClass ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3052
    selectorsImplementedInSuper notNil ifTrue:[ selectors addAll:selectorsImplementedInSuper ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3053
    selectorsForIsXXXTests notNil ifTrue:[ selectors addAll:selectorsForIsXXXTests ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3054
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3055
    selectors := selectors asOrderedCollection.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3056
    selectors sort:[:a :b | a size < b size].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3057
    selectorsForVars notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3058
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3059
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3060
                        by:[:sel | selectorsForVars includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3061
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3062
    selectorsSentInClass notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3063
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3064
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3065
                        by:[:sel | selectorsSentInClass includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3066
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3067
    selectorsImplementedInSuper notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3068
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3069
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3070
                        by:[:sel | selectorsImplementedInSuper includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3071
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3072
    selectorsForIsXXXTests notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3073
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3074
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3075
                        by:[:sel | selectorsForIsXXXTests includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3076
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3077
    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3078
    selectors size > 100 ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3079
        selectors := selectors copyTo:100.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3080
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3081
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3082
    "/ 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
  3083
    "/ he might want to complete the argument-name
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3084
    (alreadyOK and:[selectorSoFar numArgs > 0]) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3085
        allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3086
                                    collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3087
        nameBag := Bag new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3088
        allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3089
        namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3090
        namesByCount := namesByCount copyToMax:5.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3091
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3092
        "/ take the one which occurs most often
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3093
        argNames := (namesByCount collect:[:a | a key]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3094
        argNames do:[:eachArgName |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3095
            selectors add:('%1 %2 %3' 
5089
9592bdeeff69 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5086
diff changeset
  3096
                            bindWith:(selectorSoFar withColor:Color darkGrey) 
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3097
                            with:eachArgName
5089
9592bdeeff69 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5086
diff changeset
  3098
                            with:('(argument)' allItalic withColor:Color darkGrey)).
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3099
        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3100
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3101
        editActionForArg :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3102
                [:chosenItem |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3103
                    |chosenName|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3104
                    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3105
                    chosenName := chosenItem 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3106
                                    copyFrom:(selectorSoFar size+2)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3107
                                    to:(chosenItem indexOfSeparatorStartingAt:selectorSoFar size+2)-1.
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3108
                    codeView
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3109
                        undoableDo:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3110
                            (crsrPos+1) >= codeView contents size ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3111
                                codeView paste:chosenName.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3112
                                codeView cursorToCharacterPosition:(crsrPos + chosenName size - 1).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3113
                            ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3114
                                codeView cursorToCharacterPosition:crsrPos.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3115
                                codeView cursorRight.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3116
                                codeView insertStringAtCursor:chosenName.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3117
                                codeView selectFromCharacterPosition:crsrPos+1 to:crsrPos+1+chosenName size-1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3118
                                codeView dontReplaceSelectionOnInput
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3119
                            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3120
                        ]
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3121
                        info:'argname completion'.
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3122
                ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3123
    ].            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3124
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3125
    "/ no, still more possibilities for the selector.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3126
    "/ the ones implemented in superclasses are shown first.
5146
1bc2c5c6fc91 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 5143
diff changeset
  3127
    (classOrNil notNil and:[classOrNil superclass notNil]) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3128
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3129
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3130
                        by:[:sel | classOrNil superclass implements:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3131
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3132
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3133
"/"/    distances := selectors collect:[:each | each spellAgainst:selectorSoFar].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3134
"/"/    distances sortWith:selectors.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3135
"/"/    selectors reverse.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3136
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3137
    editAction :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3138
        [:selectedCompletionIndex |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3139
            |chosen rest|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3140
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3141
            chosen := selectors at:selectedCompletionIndex.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3142
            (editActionForArg notNil and:[ chosen includesSeparator ]) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3143
                editActionForArg value:chosen.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3144
            ] ifFalse:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3145
                rest := chosen copyFrom:selectorSoFar size + 1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3146
                codeView
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3147
                    undoableDo:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3148
                        codeView insertString:rest atLine:crsrLine col:crsrCol.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3149
                    ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3150
                    info:'Completion'.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3151
                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3152
                codeView cursorRight. "/ kludge to make it visible
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3153
            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3154
        ].
5044
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
    actionBlock
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3157
        value:selectors
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3158
        value:editAction
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3159
        value:'selector'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3160
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3161
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3162
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3163
    "Modified: / 16-02-2010 / 10:13:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  3164
    "Modified: / 10-02-2017 / 10:32:45 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3165
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3166
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3167
codeCompletionForTempVariable:node into:actionBlock
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3168
!
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3169
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3170
codeCompletionForVariable:node into:actionBlock
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3171
    |nonMetaClass crsrPos nm parent
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3172
     allVariables allDistances variablesAlreadyAdded nodeVal
5081
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3173
     char getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3174
     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
  3175
     suggestionsWithInfo isLeftSideOfAssignment|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3176
 
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  3177
    "/ Transcript show:'var in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3178
    classOrNil notNil ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3179
        nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3180
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3181
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3182
    nm := node name.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3183
    parent := node parent.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3184
    isLeftSideOfAssignment := false.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3185
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3186
    (parent notNil) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3187
        (parent isMessage) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3188
            node == parent receiver ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3189
                selectorOfMessageToNode := parent selector
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3190
            ]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3191
        ] ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3192
            (parent isAssignment) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3193
                isLeftSideOfAssignment := (node == node parent variable).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3194
            ].    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3195
        ].    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3196
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3197
                    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3198
    crsrPos := codeView characterPositionOfCursor.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3199
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3200
    "/ 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
  3201
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3202
    "/ If the variable represents a global, present its instance creation messages
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3203
    char := codeView characterBeforeCursor. 
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3204
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3205
    (isLeftSideOfAssignment not and:[char == Character space]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3206
        nm knownAsSymbol ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3207
            classOrNil isNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3208
                nodeVal := Smalltalk at:nm asSymbol.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3209
            ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3210
                nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3211
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3212
            nodeVal isBehavior ifTrue:[
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3213
                |selectors selectors1 selectors2|
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3214
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3215
                selectors1 := OrderedSet new.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3216
                selectors2 := OrderedSet new.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3217
                nodeVal class 
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3218
                    withAllSuperclassesDo:[:cls |
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3219
                        cls methodDictionary keysAndValuesDo:[:sel :mthd |
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3220
                            |cat|
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3221
                            cat := mthd category asLowercase.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3222
                            cat = 'instance creation' ifTrue:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3223
                                selectors1 add:sel
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3224
                            ] ifFalse:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3225
                                "/ other category: look if it sends new, new: etc.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3226
                                (mthd messagesSent includesAny:#(new new: basicNew basicNew:)) ifTrue:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3227
                                    selectors2 add:sel
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3228
                                ].    
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3229
                            ]
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3230
                        ]
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3231
                    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3232
 
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3233
                selectors := selectors1 order sort , #('-') , selectors2 order sort.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3234
                editActions := selectors collect:[:word | self editActionToInsert:word].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3235
                actionBlock value:selectors value:editActions value:nil.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3236
"/                editAction :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3237
"/                    [:answer |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3238
"/                        |s|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3239
"/                        s := answer isInteger ifTrue:[selectors at:answer] ifFalse:[answer].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3240
"/                        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3241
"/                            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3242
"/                                codeView insertString:s atCharacterPosition:crsrPos.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3243
"/                                codeView cursorToCharacterPosition:crsrPos+s size.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3244
"/                            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3245
"/                            info:'completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3246
"/                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3247
"/                actionBlock value:selectors value:editAction value:nil.
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3248
                ^ self.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3249
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3250
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3251
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3252
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3253
    "/ this is pure voodoo magic (tries to make a good spelling weight,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3254
    "/ by weighting the number of startsWith characters into the spelling distance...)
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3255
    getDistanceComputeBlockWithWeight :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3256
        [:weight |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3257
            [:each |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3258
                |dist factor|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3259
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3260
                dist := each spellAgainst:nm.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3261
                factor := 1.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3262
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3263
                "/ bump the weight-factor if the name string is included
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3264
                (each includesString:nm) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3265
                    (each startsWith:nm) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3266
                        factor := 6 * weight * nm size.
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3267
                    ] ifFalse:[ 
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3268
                        (each endsWith:nm) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3269
                            factor := 5 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3270
                        ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3271
                            nm size > 1 ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3272
                                factor := 4 * weight * nm size
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3273
                            ].    
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3274
                        ].    
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3275
                    ].    
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3276
                ] ifFalse:[
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3277
                    (each includesString:nm caseSensitive:false) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3278
                        (each asLowercase startsWith:nm asLowercase) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3279
                            factor := 4 * weight * nm size.
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3280
                        ] ifFalse:[
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3281
                            (each asLowercase endsWith:nm asLowercase) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3282
                                factor := 3 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3283
                            ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3284
                                nm size > 1 ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3285
                                    factor := 2 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3286
                                ]
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3287
                            ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3288
                        ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3289
                    ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3290
                ].    
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3291
                dist := dist + (weight*factor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3292
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3293
                each -> (dist * weight)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3294
             ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3295
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3296
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3297
    nameIsOK := false.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3298
    addWithFactorBlock :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3299
        [:eachNames :factor |
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3300
            |distanceComputeBlock|
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3301
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3302
            distanceComputeBlock := (getDistanceComputeBlockWithWeight value:factor).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3303
            eachNames do:[:nameToAdd |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3304
                (nameToAdd = nm) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3305
                    nameIsOK := true
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3306
                ] ifFalse:[ "/ not again
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3307
                    (variablesAlreadyAdded includes:nameToAdd) ifFalse:[  "/ not again
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3308
                        variablesAlreadyAdded add:nameToAdd.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3309
                        allVariables add:nameToAdd.
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3310
                        allDistances add:(distanceComputeBlock value:nameToAdd).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3311
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3312
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3313
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3314
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3315
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3316
    nm isUppercaseFirst ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3317
        globalFactor := 2.    "/ favour globals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3318
        localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3319
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3320
        globalFactor := 1.    "/ favour locals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3321
        localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3322
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3323
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3324
    variablesAlreadyAdded := Set new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3325
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3326
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3327
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3328
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3329
    (parent notNil
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3330
    and:[parent isMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3331
    and:[parent arguments includes:node]]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3332
        "/ yes -
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3333
        "/ 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
  3334
        "/ of this method, and take that as a basis of the selection
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3335
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3336
        implementors := SystemBrowser
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3337
                            findImplementorsOf:(parent selector)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3338
                            in:(Smalltalk allClasses)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3339
                            ignoreCase:false.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3340
        "/ which argument is it
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3341
        argIdx := parent arguments indexOf:node.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3342
        implementors size > 50 ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3343
            implementors := implementors asOrderedCollection copyTo:50.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3344
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3345
        namesUsed := implementors
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3346
                        collect:[:eachImplementor |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3347
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3348
                            parseTree := eachImplementor parseTree.
5539
04879fedd753 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5528
diff changeset
  3349
                            (parseTree notNil and:[parseTree arguments size >= argIdx])
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3350
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3351
                                ifTrue:[ (parseTree arguments at:argIdx) name] ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3352
                        thenSelect:[:a | a notNil].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3353
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3354
        addWithFactorBlock value:namesUsed value:(2 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3355
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3356
        "/ try some commonly used arg names, such as aBoolean, anInteger, etc.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3357
        nm size > 1 ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3358
            |tryClassNamesWith|
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3359
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3360
            ((nm startsWith:'a') and:[(nm at:2) isUppercase]) ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3361
                tryClassNamesWith := 'a'
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3362
            ] ifFalse:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3363
                (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
  3364
                    tryClassNamesWith := 'an'.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3365
                ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3366
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3367
            tryClassNamesWith notNil ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3368
                addWithFactorBlock 
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3369
                    value:(Smalltalk keys 
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3370
                            collect:[:className | tryClassNamesWith,className]
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3371
                            thenSelect:[:name | name startsWith:nm])
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3372
                    value:(1.5 * localFactor)
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3373
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3374
        ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3375
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3376
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3377
            "/ also, look for the keyword before the argument,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3378
            "/ and see if there is such an instVar
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3379
            "/ if so, add it with -Arg
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3380
            parent selector isKeyword ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3381
                kwPart := parent selector keywords at:argIdx.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3382
                (classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3383
                    addWithFactorBlock
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3384
                        value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3385
                        value:(1 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3386
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3387
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3388
            "/ look for the variable names of any other method in that class
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3389
            otherArgNames := Set new.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3390
            classOrNil methodDictionary keysAndValuesDo:[:sel :mthd |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3391
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3392
                            parseTree := mthd parseTree.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3393
                            (parseTree notNil and:[parseTree arguments size > 0])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3394
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3395
                                ifTrue:[ otherArgNames addAll:(parseTree arguments collect:[:each | each name])] ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3396
            addWithFactorBlock value:otherArgNames value:(1.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3397
        ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3398
        addWithFactorBlock 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3399
            value:(codeView previousReplacements 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3400
                                    collect:[:p | p value asString]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3401
                                    thenSelect:[:s | s isValidSmalltalkIdentifier]) 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3402
            value:(1.3 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3403
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3404
        "/ locals in the block/method
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3405
        |names nameSpace|
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3406
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3407
        names := OrderedCollection withAll:node allVariablesOnScope.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3408
        setOfNames := Set withAll:names.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3409
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3410
        rememberedScopeNodes notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3411
            "/ notNil when a parseError occurred.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3412
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3413
                (eachScope isMethod or:[eachScope isBlock]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3414
                    eachScope argumentNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3415
                        (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3416
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3417
                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3418
                    eachScope isSequence ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3419
                        eachScope temporaryNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3420
                            (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
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
                    ] ifFalse:[
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
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3425
                "/ (setOfNames includesAll:(eachScope allDefinedVariables)) ifFalse:[ self halt].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3426
            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3427
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3428
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3429
                eachScope variableNodesDo:[:var |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3430
                    (setOfNames includes:var name) ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3431
                        names add:var name. setOfNames add:var name
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3432
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3433
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3434
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3435
        ] ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3436
            "/ 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
  3437
            "/ (further down the code), add them also
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3438
            tree variableNodesDo:[:var |
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3439
                |name|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3440
                
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3441
                name := var name.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3442
                (name first isLowercase or:[isLeftSideOfAssignment not]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3443
                    (setOfNames includes:name) ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3444
                        names add:name. 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3445
                        setOfNames add:name
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3446
                    ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3447
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3448
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3449
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3450
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3451
        addWithFactorBlock value:names value:(4 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3452
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3453
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3454
            "/ instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3455
            addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3456
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3457
            "/ inherited instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3458
            classOrNil superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3459
                addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3460
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3461
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3462
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3463
        "/ magic:
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3464
        "/ if the node to be expanded is the receiver in a message, look for the selector sent to it
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3465
        "/ give names which respond to those messages a higher weight
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3466
        selectorOfMessageToNode notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3467
            |responders nonResponders|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3468
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3469
            "/ responding to that messsage
4365
fda4ed5a9772 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4364
diff changeset
  3470
"/ self halt.
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3471
            classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3472
                "/ private classes
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3473
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3474
                                   value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3475
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3476
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3477
                names := nonMetaClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3478
                responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3479
                nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3480
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3481
                addWithFactorBlock value:responders value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3482
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3483
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3484
                "/ superclass var names
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3485
                nonMetaClass allSuperclassesDo:[:superClass |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3486
                    names := superClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3487
                    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3488
                    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3489
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3490
                    addWithFactorBlock value:responders value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3491
                    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3492
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3493
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3494
                isLeftSideOfAssignment ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3495
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3496
                    classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3497
                        names := classOrNil topNameSpace keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3498
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3499
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3500
                        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
  3501
                        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
  3502
                        addWithFactorBlock value:responders value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3503
                        addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3504
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3505
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3506
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3507
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3508
            isLeftSideOfAssignment ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3509
                "/ globals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3510
                names := Smalltalk keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3511
                names := names reject:
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3512
                                [:nm |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3513
                                    (nm includes:$:) and:[ (Smalltalk at:nm) isBehavior not]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3514
                                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3515
                names := names reject:[:nm | nm startsWith:'Undeclared:::' ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3516
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3517
                names := names select:[:nm | nm isUppercaseFirst ] as:OrderedCollection.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3518
                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
  3519
                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
  3520
                addWithFactorBlock value:responders value:(1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3521
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3522
            ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3523
            
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3524
            isLeftSideOfAssignment ifFalse:[ "/ no, we will not suggest assigning to pool vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3525
                classOrNil notNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3526
                    "/ pool variables
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3527
                    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3528
                        |pool names|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3529
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3530
                        pool := Smalltalk at:poolName.
5224
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3531
                        pool notNil ifTrue:[
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3532
                            names := pool classVarNames.
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3533
                            names := names select:[:nm | nm isUppercaseFirst ].
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3534
                            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
  3535
                            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
  3536
                            addWithFactorBlock value:responders value:(2.5 * globalFactor).
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3537
                            addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3538
                        ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3539
                    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3540
                ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3541
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3542
        ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3543
            classOrNil notNil ifTrue:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3544
                isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3545
                    "/ private classes
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3546
                    addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3547
                                       value:(2.75 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3548
                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3549
                
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3550
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3551
                addWithFactorBlock value:nonMetaClass classVarNames value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3552
                nonMetaClass superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3553
                    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3554
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3555
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3556
                isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3557
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3558
                    classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3559
                        names := classOrNil topNameSpace keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3560
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3561
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3562
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3563
                    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3564
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3565
                    ((nameSpace := classOrNil nameSpace) notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3566
                        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
  3567
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3568
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3569
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3570
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3571
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3572
                isLeftSideOfAssignment ifFalse:[ "/ no, we will not suggest assigning to pool vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3573
                    "/ pool variables
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3574
                    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3575
                        |pool names|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3576
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3577
                        pool := Smalltalk at:poolName.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3578
                        pool isNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3579
                            Transcript showCR:'non existent pool: ',poolName
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3580
                        ] ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3581
                            names := pool classVarNames.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3582
                            addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3583
                        ]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3584
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3585
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3586
            ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3587
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3588
            isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3589
                "/ globals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3590
                names := OrderedCollection new.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3591
                Smalltalk keysDo:[:k |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3592
                    (k isUppercaseFirst
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3593
                    and:[ (k startsWith:'Undeclared:::') not
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3594
                    and:[ ((k includes:$:) and:[ (k includesString:'::') not]) not ]]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3595
                        names add:k
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3596
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3597
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3598
            
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3599
                "/ 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
  3600
                "/ otherwise, only consider names with a caseInsensitve prefix match
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3601
                nm first isUppercase ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3602
                    names := names select:[:globalName | globalName asLowercase startsWith: nm].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3603
                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3604
                addWithFactorBlock value:names value:(1.5 * globalFactor).
4665
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3605
            ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3606
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3607
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3608
        isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3609
            "/ pseudos - assuming that thisContext is seldom used.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3610
            "/ also assuming, that nil is short so its usually typed in.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3611
            addWithFactorBlock value:#('self') value:(2.5 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3612
            addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3613
            addWithFactorBlock value:#('super' 'false' 'true') value:(2 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3614
            addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3615
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3616
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3617
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3618
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3619
4410
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3620
"/ nope (foo := foo + 1) should be possible!!
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3621
"/    (parent notNil and:[parent isAssignment]) ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3622
"/        "/ remove the left side of the assignment (to avoid foo := foo suggestions)
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3623
"/        |i|
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3624
"/
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3625
"/        i := allDistances findFirst:[:entry | entry key = parent variable name].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3626
"/        i ~~ 0 ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3627
"/            allDistances removeAtIndex:i
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3628
"/        ].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3629
"/    ].
4385
d3381caeb327 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4382
diff changeset
  3630
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3631
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3632
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3633
                                                           ifTrue:[el]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3634
                                                           ifFalse:[best]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3635
                                                    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3636
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3637
    allDistances sort:[:a :b |
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3638
                                a value > b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3639
                                    true
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3640
                                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3641
                                    a value = b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3642
                                        a key < b key
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3643
                                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3644
                                        false
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3645
                                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3646
                                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3647
                      ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3648
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3649
    allTheBest := allDistances.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3650
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3651
    nameIsOK ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3652
        "/ 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
  3653
        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
  3654
        longerNames size < 30 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3655
            longerNames := allTheBest select:[:assoc | assoc key includesString:nm caseSensitive:false].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3656
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3657
        longerNames isEmpty ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3658
            "/ no better name
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3659
            ^ self
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3660
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3661
        allTheBest := longerNames.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3662
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3663
5033
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3664
    allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3665
        allTheBest := allTheBest copyTo:20.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3666
"/        "/ 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
  3667
"/        0.2 to:0.9 by:0.1 do:[:delta |
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3668
"/            |bestValue n|
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3669
"/            
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3670
"/            "/ if still too many, remove more and more
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3671
"/            allTheBest size > 50 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3672
"/                bestValue := bestAssoc value * delta.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3673
"/                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
  3674
"/                n size >= 15 ifTrue:[ allTheBest := n ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3675
"/            ]
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3676
"/        ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3677
"/        allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3678
"/            "/ remove all those which are below some threshold
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3679
"/            0.2 to:0.9 by:0.1 do:[:delta |
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3680
"/                |bestValue n|
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3681
"/                "/ if still too many, remove more and more
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3682
"/                allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3683
"/                    bestValue := bestAssoc value * delta.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3684
"/                    allTheBest := allTheBest select:[:entry | entry value >= bestValue ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3685
"/                ]
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3686
"/            ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3687
"/        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3688
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3689
    suggestions := allTheBest collect:[:assoc | assoc key].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3690
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3691
    "/ finally, the trick is to bring them into a reasonable order...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3692
    "/ sort the prefix matchers by length, the others by spelling distance
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3693
    "/ and bring the prefix-matchers towards the beginning
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3694
    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
  3695
                   ,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3696
                   (suggestions reject:[:s | s startsWith:nm]).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3697
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3698
    "/ if super is among them, add a full call to the completions
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3699
    (suggestions includes:'super') ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3700
        (tree notNil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3701
        and:[ tree isMethod ]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3702
            Error handle:[:ex |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3703
                Transcript showCR:'parse error in code completion ignored'.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3704
            ] do:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3705
                suggestions addFirst:('super ',(Parser methodSpecificationForSelector:tree selector argNames:(tree argumentNames)),'.').
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3706
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3707
        ].
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3708
    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3709
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3710
    suggestionsWithInfo := 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3711
        suggestions 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3712
            collect:[:eachName |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3713
                |val kind valAndKind printString|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3714
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3715
                valAndKind := self valueAndKindOfVariable:eachName.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3716
                valAndKind isNil ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3717
                    eachName
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3718
                ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3719
                    val := valAndKind first.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3720
                    kind := valAndKind second.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3721
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3722
                    val isBehavior ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3723
                        val isLoaded ifFalse:[
5090
c68614848447 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5089
diff changeset
  3724
                            eachName,' (= ', ('autoloaded class in ',(val category ? 'unknown category')) allItalic,' )'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3725
                        ] ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3726
                            val isNameSpace ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3727
                                eachName,' ( ', 'namespace' allItalic,' )'
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3728
                            ] ifFalse:[
5090
c68614848447 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5089
diff changeset
  3729
                                eachName,' (= ', ('class in ',(val category ? 'unknown category')) allItalic,' )'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3730
                            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3731
                        ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3732
                    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3733
                        "/ Parser findBest:30 selectorsFor:'isLite' in:nil forCompletion:true
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3734
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3735
                        (val isLiteral and:[ (printString := val printString) size < 15 ]) ifTrue:[
5090
c68614848447 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5089
diff changeset
  3736
                            eachName,' (= ',printString allItalic,' )'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3737
                        ] ifFalse:[
5370
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  3738
                            eachName,' (= ',val class nameWithArticle allItalic,' )'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3739
                        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3740
                    ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3741
                ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3742
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3743
5081
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3744
    editActions := suggestions collect:[:word |
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3745
                     self editActionToReplaceNode:node by:word.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3746
                   ].        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3747
    actionBlock value:suggestionsWithInfo value:editActions value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3748
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3749
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3750
    "Modified: / 16-02-2010 / 10:13:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5539
04879fedd753 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5528
diff changeset
  3751
    "Modified: / 05-05-2017 / 17:20:35 / cg"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3752
!
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3753
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3754
editActionToInsert:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3755
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3756
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3757
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3758
                codeView insertSelectedStringAtCursor:aString.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3759
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3760
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3761
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3762
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3763
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3764
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3765
editActionToInsertFromSuggestions:suggestions
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3766
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3767
        |answer|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3768
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3769
        answer := suggestions at:index.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3770
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3771
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3772
                codeView insertSelectedStringAtCursor:answer.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3773
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3774
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3775
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3776
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3777
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3778
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3779
editActionToReplaceCodeFrom:start to:stop by:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3780
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3781
        |oldVar oldLen newLen insertWithSpace|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3782
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3783
        insertWithSpace := false.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3784
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3785
        start <= stop ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3786
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3787
        ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3788
            codeView characterBeforeCursor == Character space ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3789
                insertWithSpace := true.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3790
            ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3791
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3792
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3793
        oldLen := stop - start + 1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3794
        newLen := aString size.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3795
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3796
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3797
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3798
                insertWithSpace ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3799
                    codeView insertSelectedStringAtCursor:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3800
                ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3801
                    codeView replaceFromCharacterPosition:start to:stop with:aString.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3802
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3803
                    (aString startsWith:oldVar) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3804
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3805
                    ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3806
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3807
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3808
                ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3809
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3810
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3811
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3812
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3813
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3814
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3815
    "Created: / 01-05-2016 / 18:47:40 / cg"
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3816
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3817
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3818
editActionToReplaceCodeFrom:start to:stop byWordIn:suggestions
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3819
    ^ [:index |
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3820
        |answer oldVar oldLen newLen insertWithSpace|
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3821
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3822
        insertWithSpace := false.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3823
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3824
        answer := suggestions at:index.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3825
        start <= stop ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3826
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3827
        ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3828
            codeView characterBeforeCursor == Character space ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3829
                insertWithSpace := true.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3830
            ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3831
        ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3832
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3833
        oldLen := stop - start + 1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3834
        newLen := answer size.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3835
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3836
        codeView
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3837
            undoableDo:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3838
                insertWithSpace ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3839
                    codeView insertSelectedStringAtCursor:answer
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3840
                ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3841
                    codeView replaceFromCharacterPosition:start to:stop with:answer.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3842
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3843
                    (answer startsWith:oldVar) ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3844
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3845
                    ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3846
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3847
                    ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3848
                ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3849
                codeView dontReplaceSelectionOnInput
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3850
            ]
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3851
            info:'Completion'.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3852
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3853
    ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3854
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3855
    "Created: / 01-05-2016 / 18:47:40 / cg"
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3856
!
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3857
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3858
editActionToReplaceNode:node by:word
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3859
    ^ self editActionToReplaceCodeFrom:node start to:node stop by:word
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3860
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3861
    "Created: / 01-05-2016 / 18:44:09 / cg"
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3862
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3863
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3864
editActionToReplaceNode:node byWordIn:suggestions
5114
856f583b1fff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5113
diff changeset
  3865
    ^ self editActionToReplaceCodeFrom:(node start) to:(node stop) byWordIn:suggestions
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3866
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3867
    "Created: / 01-05-2016 / 18:44:09 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3868
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3869
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3870
findBest:node for:selector inClasses:srchClassesArg
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3871
    |srchClasses bestSelectors
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3872
     allMessagesSentToVariable classesImplementingAllMessages|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3873
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3874
    srchClasses := srchClassesArg.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3875
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3876
        Transcript show:'node: '; showCR:node.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3877
        Transcript show:'srchClasses: '; showCR:srchClasses.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3878
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3879
    
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3880
    srchClasses isEmptyOrNil ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3881
        node isVariable ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3882
            allMessagesSentToVariable := Set new.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3883
            rememberedNodes do:[:eachNode |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3884
                eachNode allMessageNodesDo:[:eachMessage |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3885
                    |msgReceiver msgSelector|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3886
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3887
                    (msgReceiver := eachMessage receiver) isVariable ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3888
                        msgReceiver name = node name ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3889
                            (msgSelector := eachMessage selector) ~= selector ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3890
                                allMessagesSentToVariable add:msgSelector
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3891
                            ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3892
                        ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3893
                    ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3894
                ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3895
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3896
            allMessagesSentToVariable notEmpty ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3897
                "/ consider classes which implement all those messages.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3898
                classesImplementingAllMessages := Smalltalk allImplementorsOf:(allMessagesSentToVariable first).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3899
                allMessagesSentToVariable do:[:eachSelector |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3900
                    classesImplementingAllMessages := classesImplementingAllMessages
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3901
                                                        select:[:cls | cls implements:eachSelector].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3902
                ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3903
                srchClasses := classesImplementingAllMessages.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3904
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3905
        ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3906
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3907
    bestSelectors := Set new.
5514
8f0a8c426831 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5512
diff changeset
  3908
    (srchClasses isEmptyOrNil or:[srchClasses size > 100]) ifTrue:[
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3909
        bestSelectors addAll:( Parser findBest:50 selectorsFor:selector in:nil forCompletion:true ).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3910
        Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3911
            Transcript show:'bestSelectors (1): '; showCR:bestSelectors.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3912
        ].
5514
8f0a8c426831 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5512
diff changeset
  3913
    ] ifFalse:[          
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3914
        srchClasses do:[:srchClass |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3915
            |bestForThisClass|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3916
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3917
            bestForThisClass := Parser findBest:50 selectorsFor:selector in:srchClass forCompletion:true.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3918
            bestForThisClass := self
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3919
                                withoutSelectorsUnlikelyFor:srchClass
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3920
                                from:bestForThisClass
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3921
                                forPartial:selector.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3922
            Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3923
                Transcript show:'bestSelectors (2): '; showCR:bestForThisClass.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3924
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3925
            bestSelectors addAll:bestForThisClass.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3926
        ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3927
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3928
    "/ remove the already typed-in selector itself, in case.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3929
    bestSelectors remove:selector ifAbsent:[].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3930
    bestSelectors := bestSelectors asOrderedCollection.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3931
    ^ bestSelectors
5514
8f0a8c426831 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5512
diff changeset
  3932
8f0a8c426831 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 5512
diff changeset
  3933
    "Modified: / 13-03-2017 / 18:07:28 / cg"
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3934
!
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3935
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3936
findNodeForInterval:interval in:source
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  3937
    ^ self class findNodeForInterval:interval in:source
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3938
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3939
    "Modified: / 06-07-2011 / 12:42:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3940
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3941
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3942
findNodeForInterval:interval in:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3943
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  3944
	findNodeForInterval:interval in:source allowErrors:allowErrors
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  3945
	mustBeMethod:false
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3946
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3947
    "Modified: / 16-09-2011 / 14:52:28 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3948
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3949
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3950
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3951
    "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
  3952
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3953
    ^ self
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  3954
	findNodeForInterval:interval in:source allowErrors:allowErrors
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  3955
	mustBeMethod:mustBeMethod mustBeExpression:false
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3956
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3957
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3958
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod mustBeExpression:mustBeExpression
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3959
    "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
  3960
     (typically a selection or a word in the source).
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3961
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3962
     parse it as expression or method;
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3963
        if mustBeMethod is true, do not try as expression;
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3964
        if mustBeExpression is true, do not try as method
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3965
     expression syntax parsing is done in workspaces (doIt).
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3966
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3967
     Big hack as workaround a limitation of RBParser:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3968
     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
  3969
     (because the code is written as: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3970
        parentNode addChild:(self parseChild)
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3971
     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
  3972
     However:
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3973
        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
  3974
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3975
     Workaround:
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3976
        remember created nodes as the parse proceeds.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3977
        Thus, I can construct a partial the parent chain.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3978
    "
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3979
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3980
    |intersectingNodes smallestIntersectingNode firstIntersectingNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3981
     lastIntersectingNode onErrorBlock
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3982
     nodeGenerationHook parserClass parser currentScopeNodes bestNode|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3983
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3984
    interval isEmpty ifTrue: [^ nil].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3985
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3986
    languageOrNil notNil ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3987
        parserClass := languageOrNil parserClass.
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3988
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3989
        classOrNil notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3990
            parserClass := classOrNil programmingLanguage parserClass.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3991
        ]
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3992
    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3993
    parserClass notNil ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3994
        "/ hack
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3995
        parserClass == Parser ifTrue: [
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3996
            parserClass := RBParser.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3997
        ].
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3998
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3999
        parserClass := RBParser.
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  4000
    ].
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  4001
    parserClass isNil ifTrue: [^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4002
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  4003
    rememberedScopeNodes := nil.
4434
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
  4004
    rememberedNodes := OrderedCollection new.
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  4005
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4006
    "/ LastSource := nil.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4007
    source = LastSource ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4008
        tree := LastParseTree.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4009
        tokens := LastScanTokens.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4010
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4011
        intersectingNodes := OrderedCollection new.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4012
        currentScopeNodes := IdentitySet new.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4013
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4014
        onErrorBlock :=
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4015
            [:str :err :nodesSoFar |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4016
                |nodes|
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4017
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4018
                allowErrors ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4019
                    rememberedScopeNodes := currentScopeNodes.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4020
                    firstIntersectingNode notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4021
                        ^ firstIntersectingNode
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4022
                    ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4023
                    nodesSoFar notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4024
                        nodes := nodesSoFar asOrderedCollection
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4025
                                    collect:[:nd | nd whichNodeIntersects:interval]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4026
                                    thenSelect:[:nd | nd notNil ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4027
                        nodes size == 1 ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4028
                            ^ nodes first
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4029
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4030
                    ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4031
                ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4032
                nil
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4033
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4034
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4035
        self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4036
            Transcript show:'looking for: '; showCR:interval.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4037
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4038
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4039
        nodeGenerationHook :=
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4040
            [:node |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4041
                rememberedNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4042
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4043
                "/ 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
  4044
                "/ 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
  4045
                "/ what the semantic interpretation (especially: scope of variable) will be.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4046
                "/ therefore, we parse all, and return the found node at the end.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4047
                (node isMethod or:[node isBlock or:[node isSequence]]) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4048
                    currentScopeNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4049
                ] ifFalse:[
5075
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4050
"/                    self debuggingCodeFor:#cg is:[
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4051
"/                        node isMessage ifTrue:[
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4052
"/                            Transcript show:node; show:' '; show:node start; show:'->'; showCR:node stop.
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4053
"/                        ].
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4054
"/                    ].
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4055
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4056
                    (node intersectsInterval:interval) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4057
                        self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4058
                            Transcript showCR:'yes'.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4059
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4060
                        intersectingNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4061
                        firstIntersectingNode isNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4062
                            firstIntersectingNode := lastIntersectingNode := smallestIntersectingNode := node
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4063
                        ] ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4064
                            |lenNode lenSmallest|
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4065
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4066
                            lenNode := (node stop - node start).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4067
                            lenSmallest := (smallestIntersectingNode stop - smallestIntersectingNode start).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4068
                            lenNode < lenSmallest ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4069
                                smallestIntersectingNode := node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4070
                            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4071
                            node start > lastIntersectingNode start ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4072
                                lastIntersectingNode := node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4073
                            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4074
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4075
                    ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4076
                ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4077
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4078
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4079
        "/ one of the big problems when using the RBParser here is
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4080
        "/ that it behaves badly when a syntax error is encountered;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4081
        "/ 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
  4082
        "/ completely parsed (for example, a blockNode gets the parent-method only
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4083
        "/ after parsing). Thus, when an error is encountered, we cannot walk
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4084
        "/ 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
  4085
        "/ an inner scope (allVariablesOnScope returns only a partial set).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4086
        "/ 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
  4087
        "/ 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
  4088
        "/ parent gets set eventually, thus we might consider locals from sibling blocks.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4089
        "/ See rememberedScopeNodes handling above.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4090
        "/ Those other nodes are only remembered for failed parses;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4091
        "/ if the parse is ok, rememberedScopeNodes will be nil.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4092
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4093
        mustBeExpression ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4094
            tree := parserClass
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4095
                        parseMethod: source
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4096
                        setup:[:p |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4097
                            parser := p.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4098
                            p rememberNodes:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4099
                            p rememberTokens:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4100
                            p nodeGenerationCallback:nodeGenerationHook
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4101
                        ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4102
                        onError: onErrorBlock.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4103
            parser notNil ifTrue:[ tokens := parser rememberedTokens ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4104
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4105
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4106
        mustBeMethod ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4107
            "/ only cache parsed methods
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4108
            tree notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4109
                LastSource := source.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4110
                LastParseTree := tree.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4111
                LastScanTokens := tokens.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4112
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4113
        ] ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4114
            (tree isNil or:[firstIntersectingNode isNil]) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4115
                "/ try as an expression
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4116
                tree := parserClass
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4117
                            parseExpression: source
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4118
                            setup:[:p |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4119
                                parser := p.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4120
                                p rememberNodes:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4121
                                p rememberTokens:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4122
                                p nodeGenerationCallback:nodeGenerationHook
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4123
                            ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4124
                            onError: onErrorBlock.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4125
                parser notNil ifTrue:[ tokens := parser rememberedTokens ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4126
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4127
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4128
        lastIntersectingNode notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4129
            self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4130
                Transcript show:'last: '; showCR:lastIntersectingNode.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4131
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4132
            ^ lastIntersectingNode
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4133
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4134
        "/ firstIntersectingNode notNil ifTrue:[ ^ firstIntersectingNode ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4135
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4136
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4137
    bestNode := self findNodeForInterval:interval inParseTree:tree.
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4138
    self debuggingCodeFor:#cg is:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4139
        Transcript show:'best: '; showCR:bestNode.
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4140
    ].
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4141
    ^ bestNode
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4142
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4143
    "Created: / 16-09-2011 / 14:52:08 / cg"
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  4144
    "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
  4145
    "Modified (comment): / 01-05-2016 / 10:05:10 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4146
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4147
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4148
findNodeForInterval:interval inParseTree:parseTree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4149
    |node|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4150
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4151
    interval isEmpty ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4152
    parseTree isNil ifTrue:[^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4153
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4154
    node := parseTree whichNodeIsContainedBy:interval.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4155
    node isNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4156
	node := parseTree whichNodeIntersects:interval.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4157
	node isNil ifTrue: [
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4158
	    node := self findNodeIn:parseTree forInterval:interval
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4159
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4160
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4161
    ^ node
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4162
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4163
    "Modified: / 10-11-2006 / 13:13:58 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4164
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4165
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  4166
findNodeIn:aTree forInterval:anInterval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  4167
    ^ self class findNodeIn:aTree forInterval:anInterval
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4168
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4169
    "Modified: / 20-11-2006 / 12:31:12 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4170
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4171
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4172
insertAdditonalStuffAfterSelector:chosenCompletion
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4173
    |optionalExtraSpace|
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4174
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4175
    optionalExtraSpace := (codeView characterAfterCursor isSeparator)
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4176
                            ifTrue:['']
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4177
                            ifFalse:[' '].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4178
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4179
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4180
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4181
            'ifTrue:' 'ifFalse:' 'ifTrue:ifFalse:' 'ifFalse:ifTrue:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4182
            'and:' 'or:' 'timesRepeat:' 'whileTrue:' 'whileFalse:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4183
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4184
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4185
        codeView insertStringAtCursor:('[',optionalExtraSpace,']').
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4186
        "/ codeView cursorLeft:1+extra size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4187
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4188
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4189
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4190
            'collect:' 'select:' 'reject:' 'do:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4191
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4192
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4193
        codeView insertStringAtCursor:('[:each | ]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4194
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4195
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4196
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4197
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4198
            'contains:' 'findFirst:' 'detect:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4199
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4200
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4201
        codeView insertStringAtCursor:('[:some | ]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4202
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4203
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4204
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4205
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4206
            'remove:ifAbsent:' 'detect:ifNone:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4207
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4208
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4209
        codeView insertStringAtCursor:('[]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4210
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4211
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4212
!
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4213
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4214
messagesSentTo:varName in:aTree
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4215
    |messagesToReceiver collector|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4216
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4217
    collector :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4218
        [:node | 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4219
            (node isMessage 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4220
            and:[node receiver isVariable
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4221
            and:[node receiver name = varName]]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4222
                messagesToReceiver add:(node selector)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4223
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4224
        ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4225
        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4226
    "/ collect messages sent
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4227
    messagesToReceiver := Set new.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4228
    "/ remembered nodes is nonNil if parser aborted with error
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4229
    rememberedNodes notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4230
        rememberedNodes do:collector.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4231
    ] ifFalse:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4232
        tree allMessageNodesDo:collector.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4233
    ]. 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4234
    ^ messagesToReceiver
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4235
!
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4236
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4237
old_askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4238
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4239
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4240
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4241
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4242
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4243
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4244
    LastChoices notNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4245
	lastChoice := LastChoices at:what ifAbsent:nil.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4246
	lastChoice notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4247
	    "/ move tha last choice to the top of the list, if it is in.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4248
	    (list includes: lastChoice) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4249
		(list indexOf: lastChoice) < 10 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4250
		    list := {lastChoice allBold } , (list copyWithout:lastChoice).
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4251
		]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4252
	    ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4253
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4254
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4255
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4256
    list size < 30 ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4257
	|menu idx exitKey|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4258
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4259
	menu := PopUpMenu labels:list.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4260
	menu hideOnKeyFilter:[:key | |hide|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4261
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4262
		hide ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4263
		    exitKey := key.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4264
		].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4265
		hide].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4266
	menu memorizeLastSelection:3 "sigh, not 1 because of heading!!".
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4267
	idx := menu startUpWithHeading:'Choose ',what.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4268
	idx == 0 ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4269
	    exitKey notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4270
		codeView keyPress:exitKey x:0 y:0.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4271
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4272
	    ^ nil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4273
	].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4274
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4275
    ] ifFalse:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4276
	resources := codeView application isNil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4277
			ifTrue:[ codeView resources]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4278
			ifFalse:[ codeView application resources ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4279
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4280
	choice := Dialog
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4281
	   choose:(resources string:'Choose ',what)
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4282
	   fromList:list
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4283
	   lines:20
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4284
	   initialSelection:(list firstIfEmpty:nil)
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4285
	   title:(resources string:'Code completion').
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4286
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4287
    ].
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  4288
    choice := choice string.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4289
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4290
    LastChoices isNil ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4291
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4292
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4293
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4294
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4295
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4296
    "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
  4297
    "Modified: / 28-08-2013 / 15:28:01 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4298
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4299
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4300
sortSelectors:list forSelector:selector lcSelector:lcSelector
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4301
    list sort: [:a :b |
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4302
        |aBeforeB|
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4303
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4304
        (a startsWith:selector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4305
            (b startsWith:selector) ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4306
                aBeforeB := true
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4307
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4308
        ] ifFalse:[    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4309
            (b startsWith:selector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4310
                aBeforeB := false
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4311
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4312
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4313
        aBeforeB isNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4314
            aBeforeB := a asLowercase < b asLowercase.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4315
            (a asLowercase startsWith:lcSelector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4316
                (b asLowercase startsWith:lcSelector) ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4317
                    aBeforeB := true
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4318
                ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4319
            ] ifFalse:[    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4320
                (b asLowercase startsWith:lcSelector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4321
                    aBeforeB := false
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4322
                ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4323
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4324
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4325
        aBeforeB
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4326
    ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4327
!
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4328
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4329
sortUsefulSelectorsIn:selectorList
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4330
    "/ cosmetics: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4331
    "/  ifTrue / whileTrue should come before ifFalse/whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4332
    #(
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4333
        ifTrue:         ifFalse:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4334
        ifTrue:ifFalse: ifFalse:ifTrue:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4335
        whileTrue:      whileFalse:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4336
        whileTrue       whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4337
        whileTrue:      whileTrue
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4338
        whileFalse:     whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4339
        new:            basicNew:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4340
        new             basicNew
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4341
    ) pairWiseDo:[:sel1 :sel2 |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4342
        |idx1 idx2|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4343
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4344
        (idx1 := selectorList indexOf:sel1) ~~ 0 ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4345
            (idx2 := selectorList indexOf:sel2) ~~ 0 ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4346
                idx1 > idx2 ifTrue:[ 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4347
                    selectorList swap:idx1 with:idx2
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4348
                ] 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4349
            ] 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4350
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4351
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4352
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4353
    "Created: / 01-05-2016 / 17:48:02 / cg"
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4354
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4355
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4356
splitSelectorList:list by:condition
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4357
    |part1 part2 newList|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4358
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4359
    part1 := list select:condition.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4360
    part2 := list reject:condition.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4361
    part1 isEmpty ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4362
        newList := part2.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4363
    ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4364
        part2 isEmpty ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4365
            newList := part1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4366
        ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4367
            newList := part1 , part2.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4368
        ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4369
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4370
    ^ newList
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4371
!
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4372
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4373
treeForCode:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4374
    |tree|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4375
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4376
    source = LastSource ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4377
	tree := LastParseTree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4378
    ] ifFalse:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4379
	tree := RBParser
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4380
		parseMethod:source
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4381
		onError: [:str :err :nodesSoFar :parserOrNil|
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4382
			allowErrors ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4383
			    "/ parserOrNil isNil if raised by the scanner
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4384
			    parserOrNil notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4385
				^ parserOrNil currentMethodNode
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4386
			    ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4387
			].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4388
			^ nil
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4389
		    ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4390
		proceedAfterError:false
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4391
		rememberNodes:true.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4392
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4393
	tree notNil ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4394
	    LastSource := source.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4395
	    LastParseTree := tree.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4396
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4397
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4398
    ^ tree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4399
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4400
    "Modified: / 13-01-2012 / 11:54:30 / cg"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4401
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4402
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4403
tryCodeCompletionWithSource:source nodeInterval:interval at:characterPositionOfCursor mustBeExpression:mustBeExpression into:actionBlock
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4404
    "this is tried multiple times;
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4405
        first with cursor line only
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4406
        then with the source copied up to the cursor position,
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4407
        then with the full source.
4381
43de05e6af6c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4379
diff changeset
  4408
     Either one may give better results (for example, when completing
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4409
     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
  4410
     legal, but stupid message send to be parsed...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4411
     (which happens often after inserting)"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4412
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4413
    |node nodeParent checkedNode characterBeforeCursor|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4414
5505
485ae56088f2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5504
diff changeset
  4415
    characterPositionOfCursor < 1 ifTrue:[^ self].
485ae56088f2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5504
diff changeset
  4416
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4417
    "/ this is too naive and stupid; if there is a syntactic error,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4418
    "/ 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
  4419
    "/ 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
  4420
    "/ without any progress.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4421
    "/ 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
  4422
    "/ as it parses the code. Stop, when the interval is hit.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4423
    "/ that will also work for syntactic incorrect source code.
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4424
    (mustBeExpression not and:[methodOrNil notNil or:[classOrNil notNil]]) ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4425
        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
  4426
    ].           
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4427
    node isNil ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4428
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false mustBeExpression:true.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4429
        node isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4430
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4431
            self information:'No parseNode found (syntax error before or in comment?)'.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4432
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4433
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4434
    ].
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  4435
    "/ (source startsWith:'sel') ifTrue:[self halt].
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4436
    nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4437
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4438
    (node isVariable
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4439
    and:[ nodeParent notNil
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4440
    and:[ nodeParent isMessage
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  4441
    and:[ node stop < (characterPositionOfCursor-1) ]]]) ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4442
        node := nodeParent.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4443
        nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4444
    ].
5508
6215fe395e12 #BUGFIX by mawalch
mawalch
parents: 5505
diff changeset
  4445
    (characterPositionOfCursor-1 max:1) > source size ifTrue:[^ self].
4525
71ebd312132a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4524
diff changeset
  4446
    characterBeforeCursor := source at:(characterPositionOfCursor-1 max:1). "/ codeView characterBeforeCursor.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4447
    characterBeforeCursor isNil ifTrue:[ "at begin of line" ^ self].
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  4448
    characterBeforeCursor == $. ifTrue:[ "at end of statement" ^ self].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4449
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4450
    node isVariable ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4451
        |nodeIsInTemporaries nodeIsInBlockArguments nodeIsInMethodArguments |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4452
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4453
        nodeIsInTemporaries :=
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4454
            nodeParent notNil
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4455
            and:[ nodeParent isSequence
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4456
            and:[ nodeParent temporaries notEmptyOrNil
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4457
            and:[ node stop <= nodeParent temporaries last stop ]]]. 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4458
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4459
        nodeIsInBlockArguments :=
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4460
            node blockScope notNil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4461
            and:[ node blockScope arguments notEmptyOrNil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4462
            and:[ node stop <= node blockScope arguments last stop ]].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4463
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4464
        (nodeIsInBlockArguments not and:[rememberedScopeNodes notNil]) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4465
            "/ sigh - parent (and therefore blockScope) is unknown if parser has error
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4466
            nodeIsInBlockArguments := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4467
                rememberedScopeNodes 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4468
                    contains:[:scope |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4469
                        (scope isMethod or:[scope isBlock])
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4470
                        and:[scope arguments notEmpty
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4471
                        and:[scope arguments first start <= node start
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4472
                        and:[scope arguments last stop >= node stop]]].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4473
                    ].        
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4474
        ].
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  4475
        nodeIsInTemporaries ifTrue:[ self codeCompletionForTempVariable:node into:actionBlock. ^ self ]. 
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  4476
        nodeIsInBlockArguments ifTrue:[ self codeCompletionForBlockArgument:node into:actionBlock. ^ self ]. 
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4477
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4478
        "/ for variable completion, cursor must be right after the node 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4479
        codeView characterPositionOfCursor = (node stop + 1) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4480
            codeView characterBeforeCursor ~= Character space ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4481
                self codeCompletionForVariable:node into:actionBlock.
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4482
                ^ self.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4483
            ]. 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4484
        ].
5523
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4485
        "/ 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
  4486
        node isGlobal ifTrue:[
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4487
            |class instCreators selectors|
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4488
            
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4489
            (class := Smalltalk classNamed:node name) notNil ifTrue:[
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4490
                (instCreators := class theMetaclass methodsInCategory:'instance creation') notEmpty ifTrue:[
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4491
                    selectors := instCreators collect:[:m | m selector].
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4492
                    actionBlock 
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4493
                        value:selectors 
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4494
                        value:(selectors collect:[:sel | self editActionToInsert:sel])
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4495
                        value:'instance creation'.
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4496
                ].
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4497
            ].    
cf21c956598b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5514
diff changeset
  4498
        ]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4499
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4500
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4501
false ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4502
        codeView characterPositionOfCursor = (node stop + 2) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4503
            |classes cls| 
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4504
            "/ after a variable;
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4505
            "/ offer local messages, if receiver type is known
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4506
            classes := (self classesOfNode:node).
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4507
            classes notEmptyOrNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4508
                classes size > 1 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4509
                    cls := classes anElement.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4510
                ] ifFalse:[    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4511
                    cls := Behavior commonSuperclassOf:classes.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4512
                ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4513
            ]. 
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4514
            cls notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4515
                |clsSelectors moreSelectors|
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4516
            
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4517
                "/ completion in a message-send
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4518
                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
  4519
                clsSelectors size < 30 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4520
                    cls superclass notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4521
                        moreSelectors := cls superclass methodDictionary keys.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4522
                        clsSelectors size + moreSelectors size < 30 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4523
                            clsSelectors := clsSelectors , moreSelectors.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4524
                        ].
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4525
                    ].    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4526
                ].
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4527
                "/ self codeCompletionForMessage:checkedNode into:actionBlock.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4528
                actionBlock value:clsSelectors value:nil value:nil.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4529
                ^ self.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4530
            ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4531
        ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4532
].
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4533
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4534
    node isLiteral ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4535
        "/ however, user may want to complete a symbol inside a literal array!!
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4536
        node value isArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4537
            node token isLiteralArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4538
                |elementBeforeCursor searcher|
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4539
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4540
                elementBeforeCursor := node token value detect:[:anElementToken | characterPositionOfCursor == (anElementToken stop + 1)] ifNone:nil.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4541
                elementBeforeCursor isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4542
                    searcher :=
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4543
                        [:tok :check |
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4544
                            tok isLiteralArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4545
                                tok value inject:nil into:[:found :el | found ifNil:[searcher value:el value:check]]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4546
                            ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4547
                                (check value:tok) ifTrue:[tok] ifFalse:[nil]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4548
                            ]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4549
                        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4550
                    elementBeforeCursor := searcher value:node token value:[:anElementToken | characterPositionOfCursor == (anElementToken stop)].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4551
                ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4552
                (elementBeforeCursor notNil and:[ elementBeforeCursor value isSymbol ]) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4553
                    self codeCompletionForLiteralSymbol:nil element:elementBeforeCursor considerAll:true into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4554
                    ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4555
                ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4556
            ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4557
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4558
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4559
        "/ cursor must be right after the literal
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4560
        characterPositionOfCursor == (node stop + 1) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4561
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4562
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4563
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4564
        node value isSymbol ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4565
            self codeCompletionForLiteralSymbol:node element:nil considerAll:false into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4566
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4567
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4568
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4569
        "/ huh - completing strings, numbers or what?
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4570
        (nodeParent notNil
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4571
            and:[ nodeParent isMessage
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4572
            and:[ nodeParent isKeyword ]])
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4573
        ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4574
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4575
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4576
        "/ no, move up and try completing the outer keyword message (next arg)
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4577
        node := nodeParent.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4578
        nodeParent := node parent.
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
5050
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4581
    Verbose == true ifTrue:[
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4582
        Transcript show:'node is '.
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4583
        Error ignoreIn:[ Transcript show:node ].
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4584
        Transcript cr.
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4585
    ].
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4586
    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4587
    "/ if in a keyword-argument position...
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4588
    node isMessage ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4589
        "/ where are we?
5379
0f89327edf3c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5370
diff changeset
  4590
        node selectorString last == $: "node selector isSymbol" ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4591
            characterBeforeCursor == $: ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4592
                |argIdx senders implementors receiverClasses selectorUpToCursor implementorOfSelectorUpToCursor|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4593
                "/ about to enter an argument?
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4594
                argIdx := node selectorParts keysAndValuesDetectKey:[:idx :part |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4595
                            part stop == (codeView characterPositionOfCursor-1). 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4596
                          ] ifNone:nil.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4597
                argIdx notNil ifTrue:[          
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4598
                    selectorUpToCursor := ((node selectorParts collect:#value) copyTo:argIdx) asStringWith:''.        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4599
                    implementors := Set new.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4600
                    "/ 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
  4601
                    "/ this takes too long for a completion;
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4602
                    "/    Smalltalk allClassesDo:[:cls |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4603
                    "/        cls instAndClassMethodsDo:[:m |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4604
                    "/            (m sendsMessageForWhich:[:sel | sel startsWith:node selector]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4605
                    "/                senders add:m
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4606
                    "/            ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4607
                    "/        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4608
                    "/    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4609
                    "/ therefore, restrict to a max. of 5 classes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4610
                    receiverClasses := self classesOfNode:node receiver.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4611
                    (receiverClasses notEmptyOrNil and:[receiverClasses size <= 5]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4612
                        receiverClasses do:[:eachPossibleReceiverClass |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4613
                            eachPossibleReceiverClass withAllSuperclassesDo:[:cls |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4614
                                cls methodDictionary keysAndValuesDo:[:sel :mthd |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4615
                                    (sel startsWith:selectorUpToCursor) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4616
                                        implementors add:mthd.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4617
                                        (sel = selectorUpToCursor) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4618
                                            implementorOfSelectorUpToCursor := implementorOfSelectorUpToCursor ? mthd
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4619
                                        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4620
                                    ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4621
                                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4622
                            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4623
                        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4624
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4625
                    implementorOfSelectorUpToCursor notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4626
                        |tree argName|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4627
                        
5123
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4628
                        SourceCodeManagerError handle:[:ex |
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4629
                        ] do:[    
5392
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4630
                            tree := implementorOfSelectorUpToCursor parseTree. 
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  4631
                            (tree notNil and:[tree argumentNames size >= argIdx]) ifTrue:[
5392
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4632
                                argName := tree argumentNames at:argIdx.
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4633
                                (argName includesString:'block' caseSensitive:false) ifTrue:[
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4634
                                    actionBlock value:{'[ "',argName,'" ]'}
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4635
                                                value:{ self editActionToInsert:('[ "',argName,'" ]') }
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4636
                                                value:'block argument'
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4637
                                ]. 
5123
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4638
                            ].
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4639
                        ].    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4640
                    ] ifFalse:[    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4641
                        implementors notEmpty ifTrue:[
5082
87e1ffeceb8a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5081
diff changeset
  4642
                            self breakPoint:#cg.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4643
                        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4644
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4645
                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4646
            ].    
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  4647
        ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4648
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4649
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4650
    (node isVariable or:[node isBlock and:[node stop notNil]]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4651
        (characterPositionOfCursor == (node stop + 1)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4652
        "/ hack (spaces at end of line)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4653
        or:[characterPositionOfCursor == (node stop)]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4654
            codeView characterBeforeCursor == Character space ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4655
                self codeCompletionForMessageTo:node into:actionBlock.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4656
                ^ self
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4657
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4658
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4659
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4660
5114
856f583b1fff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5113
diff changeset
  4661
    "/ characterBeforeCursor == $) ifTrue:[self halt].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  4662
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4663
    "/ move outward, until we find a message-send node,
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4664
    "/ or the method's selector pattern node.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4665
    checkedNode := node.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4666
    [checkedNode notNil] whileTrue:[
5322
407a341d0c83 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5312
diff changeset
  4667
        (characterPositionOfCursor <= ((checkedNode stop ? source size)+1)) ifTrue:[
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4668
            "/ Transcript show:'T: '; showCR:node.
5048
8dbd0140a2f0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5047
diff changeset
  4669
            "/ Transcript showCR:('Inside a ',(checkedNode className)).
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4670
            "/ self information:('Inside a ',(checkedNode className)).
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4671
            (checkedNode isMessage 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4672
            and:[characterPositionOfCursor < (checkedNode selectorParts first start)]) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4673
                self codeCompletionForMessageTo:checkedNode receiver into:actionBlock.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4674
                ^ self
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4675
            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4676
            
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4677
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4678
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4679
        checkedNode isMessage ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4680
            "/ completion in a message-send
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4681
            "/ Transcript showCR:'codeCompletionForMessage'.
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4682
            self codeCompletionForMessage:checkedNode into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4683
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4684
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4685
        checkedNode isMethod ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4686
            "/ completion in a method's selector pattern
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4687
            "/ Transcript showCR:'codeCompletionForMethodSpec'.
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4688
            self codeCompletionForMethodSpec:checkedNode into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4689
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4690
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4691
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4692
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4693
        checkedNode := checkedNode parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4694
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4695
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4696
    "/ Transcript showCR:'Node is neither variable nor message'.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4697
    self information:'Node is neither variable nor message.'.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4698
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4699
    "Modified: / 04-07-2006 / 18:48:26 / fm"
5528
c514dd6f6e3b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5523
diff changeset
  4700
    "Modified: / 08-04-2017 / 16:01:14 / cg"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4701
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4702
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4703
withoutSelectorsUnlikelyFor:aClass from:selectorsArg forPartial:partialSelector
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4704
    "some heuristics;
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4705
     as best selectors has been chosen by implemented methods for aClass,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4706
     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
  4707
     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
  4708
     implement at:put: themself.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4709
     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
  4710
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4711
    |selectors noNilChecks noIsXXXChecks noNoXXXChecks noBecome 
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4712
     noIndexedSetters noIndexedGetters noSizeQueries docSelectors|
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4713
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4714
    aClass isNil ifTrue:[ ^ selectorsArg ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4715
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4716
    noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := false.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4717
    noIndexedSetters := noIndexedGetters := noSizeQueries := false.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4718
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4719
    selectors := (selectorsArg ? #()) asOrderedCollection.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4720
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4721
    self tracePoint:#cg message:aClass.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4722
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4723
    aClass isMeta ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4724
        docSelectors := #(copyright documentation examples 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4725
                          version version_CVS version_SVN version_HG).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4726
        selectors := selectors reject:[:sel | docSelectors includes:sel].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4727
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4728
    
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4729
    "/ actually meaning booleans here
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4730
    (aClass == True or:[aClass == False]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4731
        noNilChecks := noBecome := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4732
        (partialSelector startsWith:'is') ifFalse:[ noIsXXXChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4733
        (partialSelector startsWith:'no') ifFalse:[ noNoXXXChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4734
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4735
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4736
    (aClass includesBehavior: ArithmeticValue) ifTrue:[ noNilChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4737
    (aClass includesBehavior: Symbol) ifTrue:[ noNilChecks := noBecome := noIndexedSetters := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4738
    (aClass includesBehavior: Number) ifTrue:[ noBecome := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4739
    (aClass includesBehavior: Block) ifTrue:[ noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4740
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4741
    (aClass isMeta) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4742
        noNilChecks := noBecome := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4743
        "/ 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
  4744
        selectors := selectors reject:
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4745
            [:sel |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4746
                (Object implements:sel)
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4747
                and:[ (Smalltalk allImplementorsOf:sel) conform:[:impl | impl isMeta not]]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4748
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4749
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4750
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4751
    aClass isVariable ifFalse:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4752
        noIndexedGetters := noIndexedSetters := noSizeQueries := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4753
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4754
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4755
    noIndexedSetters ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4756
        #( #'at:put:' #'basicAt:put:') do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4757
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4758
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4759
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4760
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4761
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4762
    noIndexedGetters ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4763
        #( #'at:' #'basicAt:') do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4764
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4765
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4766
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4767
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4768
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4769
    noSizeQueries ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4770
        #( #size #basicSize ) do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4771
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4772
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4773
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4774
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4775
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4776
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4777
    noNilChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4778
        selectors removeAllFoundIn:#(
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4779
                    'isNil' 'notNil'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4780
                    'ifNil:' 'ifNotNil:' 'ifNil:ifNotNil:' 'ifNotNil:ifNil:' 'ifNotNilDo:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4781
                    'ifEmpty:' 'ifNotEmpty:' 'ifNotEmptyDo:' 'ifEmpty:ifNotEmpty:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4782
                    'ifEmpty:ifNotEmptyDo:' 'ifNotEmptyDo:ifEmpty:' 'ifEmptyDo:ifNotEmpty:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4783
                  ).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4784
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4785
    noIsXXXChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4786
        "/ get rid of all isXXX selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4787
        selectors := selectors reject:[:sel | sel startsWith:'is'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4788
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4789
    noNoXXXChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4790
        "/ get rid of all notXXX selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4791
        selectors := selectors reject:[:sel | sel startsWith:'no'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4792
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4793
    noBecome ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4794
        "/ get rid of all become* selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4795
        selectors := selectors reject:[:sel | sel startsWith:'become'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4796
        selectors remove:#oneWayBecome: ifAbsent:[].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4797
        selectors := selectors reject:[:sel | sel startsWith:'changeClassTo'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4798
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4799
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4800
    "/ 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
  4801
    selectors := (selectors select:[:sel | aClass implements:sel])
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4802
                 ,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4803
                 (selectors reject:[:sel | aClass implements:sel]).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4804
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4805
    ^ selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4806
! !
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4807
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4808
!DoWhatIMeanSupport methodsFor:'code completion-helpers-old'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4809
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4810
codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4811
    |sym possibleCompletions best start stop oldLen newLen oldVar|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4812
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4813
    sym := node value.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4814
    possibleCompletions := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4815
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4816
    Symbol allInstancesDo:[:existingSym |
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4817
	(existingSym startsWith:sym) ifTrue:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4818
	    (existingSym = sym) ifFalse:[
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4819
		possibleCompletions add:existingSym
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4820
	    ].
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4821
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4822
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4823
    possibleCompletions sort.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4824
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4825
    best := possibleCompletions longestCommonPrefix.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4826
    (best = sym or:[(possibleCompletions includes:best) not]) ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4827
	best := self askUserForCompletion:'symbol literal' for:codeView at: node start from:possibleCompletions.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4828
	best isNil ifTrue:[^ self].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4829
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4830
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4831
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4832
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4833
    start := node start.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4834
    stop := node stop.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4835
    (codeView characterAtCharacterPosition:start) == $# ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4836
	start := start + 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4837
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4838
    (codeView characterAtCharacterPosition:start) == $' ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4839
	start := start + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4840
	stop := stop - 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4841
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4842
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4843
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4844
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4845
    codeView
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4846
	undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4847
	info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4848
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4849
    (best startsWith:oldVar) ifTrue:[
5542
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4850
	oldLen := stop - start + 1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4851
	newLen := best size.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4852
	codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
27dfb346d0cb #DOCUMENTATION by mawalch
mawalch
parents: 5539
diff changeset
  4853
	codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4854
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4855
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4856
    "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
  4857
    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4858
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4859
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4860
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
  4861
    "going to be OBSOLETE"
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4862
    
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4863
    |selector
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4864
     bestSelectors selector2 bestSelectors2 bestSelectorsFromRB allBest best numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4865
     newParts nSelParts oldLen newLen selectorParts
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4866
     findBest parentNode selectorInBest selector2InBest2
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4867
     parser selectorsSentInCode selectorsImplementedInClass
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4868
     varName rbTypes rbType tryParent parentIsKeywordMessage parentIsBinaryMessage rcvrClass|
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4869
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4870
    RefactoryTyper notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4871
        "/ refactory package also provides a (very limited) typer;
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4872
        "/ 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
  4873
        (node receiver isVariable) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4874
            varName := node receiver name.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4875
            varName isUppercaseFirst ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4876
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4877
                tree := RBParser
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4878
                            parseMethod:codeView contents string
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4879
                            onError:[:aString :pos | nil].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4880
                tree notNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4881
                    rbTypes := RefactoryTyper
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4882
                                classesFor: varName
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4883
                                in: tree
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4884
                                model: nil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4885
                                ignoredSelectors:(Array with:node selector).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4886
                    rbTypes size > 0 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4887
                        rbTypes size > 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4888
                            rbTypes remove:ProtoObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4889
                            rbTypes remove:Autoload ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4890
                            rbTypes remove:ObsoleteObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4891
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4892
                        rbTypes size == 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4893
                            rbType := rbTypes first.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4894
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4895
                            rbType := Class commonSuperclassOf:rbTypes
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4896
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4897
                        (rbType notNil "and:[rbType ~= Object]") ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4898
                            bestSelectorsFromRB := Parser findBest:30 selectorsFor:node selector in:rbType forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4899
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4900
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4901
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4902
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4903
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4904
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4905
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4906
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4907
        parser := Parser parseMethod:codeView contents string in:classOrNil ignoreErrors:true ignoreWarnings:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4908
        selectorsSentInCode := parser messagesSent.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4909
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4910
    classOrNil notNil ifTrue:[
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4911
        selectorsImplementedInClass := Set new.
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4912
        classOrNil withAllSuperclassesDo:[:cls |
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4913
            cls theNonMetaclass ~~ Object ifTrue:[
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4914
                selectorsImplementedInClass addAll:cls selectors.
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4915
            ]
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4916
        ]    
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4917
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4918
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4919
    findBest := [:node :selector |
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4920
        |srchClasses bestSelectors bestPrefixes|
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4921
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4922
        codeView withCursor:(Cursor questionMark) do:[
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4923
            srchClasses := self classesOfNode:node receiver.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4924
            srchClasses notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4925
                bestSelectors := Set new.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4926
                srchClasses do:[:each |
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4927
                    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
  4928
                ]    
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4929
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4930
                bestSelectors := Parser findBest:30 selectorsFor:selector in:nil forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4931
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4932
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4933
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4934
        (bestSelectors includes:selector) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4935
            bestSelectors := bestSelectors select:[:sel | sel size > selector size].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4936
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4937
        bestSelectors
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4938
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4939
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4940
    selector := node selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4941
    bestSelectors := findBest value:node value:selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4942
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4943
    parentNode := node parent.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4944
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4945
    parentIsKeywordMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4946
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4947
            and:[ parentNode isMessage
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  4948
            and:[ parentNode selector isKeyword]]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4949
    parentIsBinaryMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4950
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4951
            and:[ parentNode isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4952
            and:[ parentNode selector isBinarySelector]]).
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4953
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4954
    tryParent := false.
5471
289b60e70a2c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5462
diff changeset
  4955
    "/ 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
  4956
    (node selector isUnarySelector and:[ parentIsKeywordMessage ]) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4957
        tryParent := true.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4958
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4959
        "/ 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
  4960
        (node isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4961
        and:[ node receiver isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4962
        and:[ node receiver receiver isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4963
        and:[ node receiver receiver name isUppercaseFirst
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4964
        and:[ #(new new:) includes:(selector2 := node receiver selector) ]]]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4965
            rcvrClass := Smalltalk classNamed:(node receiver receiver name).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4966
            "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4967
            bestSelectors := Parser findBest:30 selectorsFor:selector in:rcvrClass forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4968
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4969
            "/ also, if nothing was found
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4970
            (bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4971
            and:[ parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4972
            and:[ parentNode isMessage ]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4973
                "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4974
                "/ selector2 := parentNode selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4975
                "/ selector2 := selector2,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4976
                bestSelectors := findBest value:parentNode value:selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4977
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4978
        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4979
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4980
    tryParent ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4981
        selector2 := parentNode selector,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4982
        bestSelectors2 := findBest value:parentNode value:selector2.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4983
    ].
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4984
    bestSelectorsFromRB notEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4985
        bestSelectors := bestSelectorsFromRB , (bestSelectors reject:[:sel | bestSelectorsFromRB includes:sel]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4986
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4987
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4988
    "/ if the parent is a keyword selector, the child cannot
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4989
    (parentIsKeywordMessage or:[parentIsBinaryMessage]) ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  4990
        bestSelectors := bestSelectors reject:[:sel | sel isKeyword]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4991
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4992
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4993
    bestSelectors2 isEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4994
        allBest := bestSelectors.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4995
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4996
        bestSelectors isEmptyOrNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4997
            allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4998
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4999
            selectorInBest := (bestSelectors contains:[:sel | sel asLowercase startsWith:selector asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5000
            selector2InBest2 := (bestSelectors2 contains:[:sel | sel asLowercase startsWith:selector2 asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5001
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5002
            (selectorInBest not and:[ selector2InBest2 ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5003
                "/ selector2 is more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5004
                allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5005
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5006
                (selectorInBest and:[ selector2InBest2 not ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5007
                    "/ selector more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5008
                    allBest := bestSelectors
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5009
                ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5010
                    "/ assume same likelyness
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5011
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5012
                    allBest := bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5013
                                ifTrue:[ bestSelectors2 ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5014
                                ifFalse:[ bestSelectors , #(nil) , bestSelectors2 ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5015
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5016
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5017
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5018
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5019
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5020
    allBest isEmptyOrNil ifTrue:[ ^ self ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5021
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5022
    selectorsImplementedInClass notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5023
        "/ 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
  5024
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5025
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5026
                    by:[:sel | selectorsImplementedInClass includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5027
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5028
    selectorsSentInCode notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5029
        "/ 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
  5030
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5031
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5032
                    by:[:sel | selectorsSentInCode includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5033
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5034
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5035
    "/ 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
  5036
    allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5037
                splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5038
                by:[:sel | sel notNil and:[sel startsWith:selector]].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5039
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5040
    best := allBest first.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5041
    allBest size > 1 ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5042
        "allBest size < 20 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5043
            |idx|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5044
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5045
            idx := (PopUpMenu labels:allBest) startUp.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5046
            idx == 0 ifTrue:[ ^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5047
            best := allBest at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5048
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5049
            allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5050
            best := Dialog request:'Matching selectors:' initialAnswer:best list:allBest.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5051
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5052
        ]."
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5053
        allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5054
        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
  5055
        best isEmptyOrNil ifTrue:[^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5056
        best = '-' ifTrue:[^ self].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5057
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5058
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5059
"/    srchClass notNil ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5060
"/        implClass := srchClass whichClassIncludesSelector:best.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5061
"/    ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5062
"/        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
  5063
"/        implClass size == 1 ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5064
"/            implClass := implClass first.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5065
"/        ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5066
"/            implClass := nil
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5067
"/        ]
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5068
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5069
"/
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5070
"/    info := best storeString.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5071
"/    implClass notNil ifTrue:[
5505
485ae56088f2 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5504
diff changeset
  5072
"/        info := implClass name , ' » ' , info.
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5073
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5074
"/    self information:info.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5075
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5076
    best ~= selector ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5077
        numArgs := best numArgs.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5078
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5079
        (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:best]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5080
            selectorParts := parentNode selectorParts , node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5081
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5082
            selectorParts := node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5083
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5084
        nSelParts := selectorParts size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5085
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5086
        newParts := best asCollectionOfSubstringsSeparatedBy:$:.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5087
        newParts := newParts select:[:part | part size > 0].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5088
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5089
        codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5090
            undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5091
                |newCursorPosition stop|
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
                numArgs > nSelParts ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5094
                    stop := selectorParts last stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5095
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5096
                    "/ append the rest ...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5097
                    numArgs downTo:nSelParts+1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5098
                        |newPart|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5099
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5100
                        newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5101
                        (best endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5102
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5103
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5104
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5105
                        (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5106
                            newPart := ':' , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5107
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5108
                        newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5109
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5110
                        codeView replaceFromCharacterPosition:stop to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5111
                        newCursorPosition := stop + newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5112
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5113
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5114
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5115
                (nSelParts min:newParts size) downTo:1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5116
                    |newPart oldPartialToken start stop nextChar|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5117
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5118
                    newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5119
                    oldPartialToken := selectorParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5120
                    start := oldPartialToken start.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5121
                    stop := oldPartialToken stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5122
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5123
                    (best isKeyword) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5124
                        (oldPartialToken value endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5125
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5126
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5127
                            (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5128
                                newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5129
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5130
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5131
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5132
                        (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5133
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5134
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5135
                            nextChar := codeView characterAtCharacterPosition:stop+1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5136
                            nextChar isSeparator ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5137
                                (').' includes:nextChar) ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5138
                                    newPart := newPart , ' '
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5139
                                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5140
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5141
                        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5142
"/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5143
"/                        ] ifFalse:[
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5144
"/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5145
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5146
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5147
                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5148
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5149
                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5150
                    newCursorPosition isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5151
                        oldLen := stop - start + 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5152
                        newLen := newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5153
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5154
                        newCursorPosition := stop + (newLen-oldLen)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5155
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5156
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5157
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5158
                codeView cursorToCharacterPosition:newCursorPosition.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5159
                codeView cursorRight.  "/ avoid going to the next line !!
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5160
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5161
                ((best endsWith:':') and:[numArgs == 1]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5162
                    |impls impl|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5163
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5164
                    "/ see if it expects a block argument (heuristic)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5165
                    best := best asSymbol.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5166
                    (node notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5167
                    and:[classOrNil notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5168
                    and:[node receiver isSelf]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5169
                        (impl := classOrNil whichClassImplements:best) isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5170
                            impls := #().
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5171
                            Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5172
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5173
                            impls := { impl }
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5174
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5175
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5176
                        impls := Smalltalk allImplementorsOf:best.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5177
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5178
                    (impls contains:[:cls |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5179
                        |argName|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5180
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5181
                        argName := ((cls compiledMethodAt:best) methodArgAndVarNames at:1) asLowercase.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5182
                        (argName includesString:'block') or:[ (argName includesString:'action')]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5183
                    ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5184
                        codeView insertStringAtCursor:'['
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5185
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5186
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5187
                codeView dontReplaceSelectionOnInput.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5188
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5189
        info:'Completion'.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5190
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5191
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5192
    "Created: / 10-11-2006 / 13:18:27 / cg"
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5193
    "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
  5194
    "Modified: / 30-04-2016 / 18:21:21 / cg"
5471
289b60e70a2c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5462
diff changeset
  5195
    "Modified (comment): / 13-02-2017 / 20:37:55 / cg"
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5196
!
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5197
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5198
codeCompletionForVariable:node inClass:classOrNil codeView:codeView
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5199
    |parent nonMetaClass crsrPos nm
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5200
     allVariables allDistances best nodeVal
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5201
     char start stop oldLen newLen oldVar
4485
c6ed849af389 class: DoWhatIMeanSupport
Stefan Vogel <sv@exept.de>
parents: 4484
diff changeset
  5202
     getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5203
     globalFactor localFactor selectorOfMessageToNode tree implementors argIdx namesUsed kwPart|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5204
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5205
    classOrNil notNil ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5206
        nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5207
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5208
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5209
    nm := node name.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5210
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5211
    "/ 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
  5212
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5213
    "/ If the variable represents a global, present its instance creation messages
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5214
    crsrPos := codeView characterPositionOfCursor.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5215
    char := codeView characterAtCharacterPosition:crsrPos-1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5216
    char isSeparator ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5217
        classOrNil isNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5218
            nodeVal := Smalltalk at:nm asSymbol.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5219
        ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5220
            nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5221
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5222
        nodeVal isBehavior ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5223
            |methods menu exitKey idx|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5224
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5225
            methods := nodeVal class methodDictionary values
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5226
                            select:[:m | |cat|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5227
                                cat := m category asLowercase.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5228
                                cat = 'instance creation'
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5229
                            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5230
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5231
            menu := PopUpMenu labels:(methods collect:[:each | each selector]).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5232
            menu hideOnKeyFilter:[:key | |hide|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5233
                    hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5234
                    hide ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5235
                        exitKey := key.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5236
                    ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5237
                    hide].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5238
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5239
            idx := menu startUp.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5240
            idx == 0 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5241
                exitKey notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5242
                    codeView keyPress:exitKey x:0 y:0.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5243
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5244
                ^ self
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5245
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5246
            best := (methods at:idx) selector.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5247
            codeView
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5248
                undoableDo:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5249
                    codeView insertString:best atCharacterPosition:crsrPos.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5250
                    codeView cursorToCharacterPosition:crsrPos+best size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5251
                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5252
                info:'completion'.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5253
            ^ self.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5254
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5255
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5256
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5257
    ((parent := node parent) notNil and:[parent isMessage]) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5258
        node == parent receiver ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5259
            selectorOfMessageToNode := parent selector
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5260
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5261
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5262
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5263
    getDistanceComputeBlockWithWeight :=
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5264
        [:weight |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5265
            [:each |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5266
                |dist factor|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5267
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5268
                dist := each spellAgainst:nm.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5269
                factor := 1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5270
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5271
                (each startsWith:nm) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5272
                    factor := 6 * nm size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5273
                ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5274
                    (each asLowercase startsWith:nm asLowercase) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5275
                        factor := 4 * nm size.
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5276
                    ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5277
                        (each endsWith:nm) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5278
                            factor := 3 * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5279
                        ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5280
                            (each asLowercase endsWith:nm asLowercase) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5281
                                factor := 2 * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5282
                            ]    
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5283
                        ]    
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5284
                    ]    
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5285
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5286
                dist := dist + (weight*factor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5287
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5288
                each -> (dist * weight)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5289
             ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5290
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5291
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5292
    addWithFactorBlock :=
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5293
        [:eachNames :factor | |namesToAdd|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5294
            namesToAdd := eachNames select:[:nameToAdd | nameToAdd ~= nm ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5295
            namesToAdd := namesToAdd reject:[:each | allVariables includes:each ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5296
            allVariables addAll:namesToAdd.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5297
            allDistances addAll:(namesToAdd collect:(getDistanceComputeBlockWithWeight value:factor)).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5298
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5299
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5300
    nm isUppercaseFirst ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5301
        globalFactor := 2.    "/ favour globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5302
        localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5303
    ] ifFalse:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5304
        globalFactor := 1.    "/ favour locals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5305
        localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5306
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5307
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5308
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5309
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5310
4308
f1c31624744d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4304
diff changeset
  5311
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5312
    ((parent := node parent) notNil
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5313
    and:[parent isMethod
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5314
    and:[parent arguments includes:node]]) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5315
        "/ 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
  5316
        "/ 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
  5317
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5318
        implementors := SystemBrowser
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5319
                            findImplementorsOf:(parent selector)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5320
                            in:(Smalltalk allClasses)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5321
                            ignoreCase:false.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5322
        "/ which argument is it
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5323
        argIdx := parent arguments indexOf:node.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5324
        implementors size > 50 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5325
            implementors := implementors asOrderedCollection copyTo:50.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5326
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5327
        namesUsed := implementors
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5328
                        collect:[:eachImplementor |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5329
                            |parseTree|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5330
                            parseTree := eachImplementor parseTree.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5331
                            (parseTree notNil and:[parseTree arguments size > 0])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5332
                                ifFalse:nil
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5333
                                ifTrue:[ (parseTree arguments at:argIdx) name] ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5334
                        thenSelect:[:a | a notNil] as:Set.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5335
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5336
        addWithFactorBlock value:namesUsed value:(2 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5337
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5338
        classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5339
            "/ also, look for the keyword before the argument,
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5340
            "/ and see if there is such an instVar
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5341
            "/ if so, add it with -Arg
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5342
            parent selector isKeyword ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5343
                kwPart := parent selector keywords at:argIdx.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5344
                (classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5345
                    addWithFactorBlock
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5346
                        value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5347
                        value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5348
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5349
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5350
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5351
    ] ifFalse:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5352
        classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5353
            "/ locals in the block/method
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5354
            |names|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5355
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5356
            names := node allVariablesOnScope.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5357
            "/ if there were no variables (due to a parse error)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5358
            "/ do another parse and see what we have
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5359
            names isEmpty ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5360
                tree := self treeForCode:(codeView contentsAsString string) allowErrors:true.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5361
                "/ better if we already have a body (include locals then)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5362
                "/ otherwise, only the arguments are considered
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5363
                tree notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5364
                    names := (tree body ? tree) allVariablesOnScope.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5365
                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5366
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5367
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5368
            addWithFactorBlock value:names value:(4 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5369
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5370
            "/ instance variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5371
            addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5372
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5373
            "/ inherited instance variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5374
            classOrNil superclass notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5375
                addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5376
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5377
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5378
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5379
        selectorOfMessageToNode notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5380
            |names responders nonResponders|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5381
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5382
            "/ responding to that messsage
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5383
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5384
            classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5385
                "/ private classes
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5386
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5387
                                   value:(1.75 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5388
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5389
                "/ class variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5390
                names := nonMetaClass classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5391
                responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5392
                nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5393
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5394
                addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5395
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5396
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5397
                "/ superclass var names
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5398
                nonMetaClass allSuperclassesDo:[:superClass |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5399
                    names := superClass classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5400
                    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5401
                    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5402
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5403
                    addWithFactorBlock value:responders value:(1 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5404
                    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5405
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5406
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5407
                "/ namespace vars
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5408
                classOrNil nameSpace ~~ Smalltalk ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5409
                    names := classOrNil topNameSpace keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5410
                    names := names reject:[:nm | nm includes:$:].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5411
                    names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5412
                    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
  5413
                    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
  5414
                    addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5415
                    addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5416
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5417
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5418
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5419
            "/ globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5420
            names := Smalltalk keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5421
            "/ names := names reject:[:nm | nm includes:$:].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5422
            names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5423
            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
  5424
            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
  5425
            addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5426
            addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5427
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5428
            "/ pool variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5429
            classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5430
                |pool|
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
                pool := Smalltalk at:poolName.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5433
                names := pool classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5434
                names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5435
                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
  5436
                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
  5437
                addWithFactorBlock value:responders value:(2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5438
                addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5439
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5440
        ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5441
            |names|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5442
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5443
            classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5444
                "/ private classes
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5445
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5446
                                   value:(1.75 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5447
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5448
                "/ class variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5449
                addWithFactorBlock value:nonMetaClass classVarNames value:(2.0 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5450
                classOrNil superclass notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5451
                    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.0 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5452
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5453
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5454
                "/ namespace vars
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5455
                classOrNil nameSpace ~~ Smalltalk ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5456
                    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
  5457
                    names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5458
                    addWithFactorBlock value:names value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5459
                ].
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
                "/ pool variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5462
                classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5463
                    |pool|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5464
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5465
                    pool := Smalltalk at:poolName.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5466
                    names := pool classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5467
                    addWithFactorBlock value:names value:(2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5468
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5469
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5470
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5471
            "/ globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5472
            names := Smalltalk keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5473
            names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5474
            addWithFactorBlock value:names value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5475
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5476
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5477
        "/ pseudos - assuming that thisContext is seldom used.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5478
        "/ also assuming, that nil is short so its usually typed in.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5479
        addWithFactorBlock value:#('self') value:(2.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5480
        addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5481
        addWithFactorBlock value:#('super' 'false') value:(2 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5482
        addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5483
        addWithFactorBlock value:#('true') value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5484
        addWithFactorBlock value:#('false') value:(1 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5485
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5486
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5487
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5488
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5489
    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
  5490
                                                           ifTrue:[el]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5491
                                                           ifFalse:[best]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5492
                                                    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5493
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5494
    allDistances sort:[:a :b |
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5495
                                a value > b value ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5496
                                    true
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5497
                                ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5498
                                    a value = b value ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5499
                                        a key < b key
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5500
                                    ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5501
                                        false
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5502
                                    ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5503
                                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5504
                      ].
4340
b7b73a78385a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4339
diff changeset
  5505
    ((allTheBest := allDistances) count:[:entry | entry value]) > 20 ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5506
        allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.5)].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5507
        allTheBest size > 15 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5508
            allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.8)].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5509
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5510
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5511
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5512
    start := node start.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5513
    stop := node stop.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5514
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5515
    best := self askUserForCompletion:('Variable for "%1"' bindWith:node name)
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5516
                 for:codeView at: start
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5517
                 from:(allTheBest collect:[:assoc | assoc key]).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5518
    best isNil ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5519
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5520
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5521
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5522
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5523
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5524
    codeView
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5525
        undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5526
        info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5527
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5528
    (best startsWith:oldVar) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5529
        oldLen := stop - start + 1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5530
        newLen := best size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5531
        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5532
        codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5533
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5534
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5535
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5536
    "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
  5537
    "Modified: / 28-08-2013 / 15:37:28 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5538
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5539
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5540
!DoWhatIMeanSupport methodsFor:'helpers-naive type inference'!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5541
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5542
addClassesFromAssignmentTo:varName in:aTree to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5543
    "/ assignments...
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5544
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5545
    aTree allAssignmentNodesDo:[:eachAssignmentNode |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5546
        |leftSide|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5547
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5548
        leftSide := eachAssignmentNode variable.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5549
        leftSide name = varName ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5550
            self 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5551
                addClassesOfExpression:eachAssignmentNode value 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5552
                inClass:classOrNil to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5553
        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5554
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5555
    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5556
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5557
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5558
addClassesFromMessagesSentTo:varNode in:aTree to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5559
    "/ from the set of messages sent at other places,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5560
    "/ try to find classes, which respond to all those.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5561
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5562
    |varName allSelectors candidates|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5563
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5564
    varName := varNode name.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5565
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5566
    allSelectors := IdentitySet new.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5567
    aTree allMessageNodesDo:[:eachMessageNode |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5568
        |rcvr|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5569
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5570
        rcvr := eachMessageNode receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5571
        (rcvr isVariable and:[rcvr name = varName]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5572
            allSelectors add:eachMessageNode selector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5573
        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5574
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5575
    
5324
555436a71f8d #OTHER by mawalch
mawalch
parents: 5322
diff changeset
  5576
    "/ the selector being completed must be ignored here
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5577
    (varNode parent notNil and:[varNode parent isMessage]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5578
        allSelectors remove:(varNode parent selector) ifAbsent:[].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5579
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5580
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5581
    "/ now look for classes which implement all of them
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5582
    candidates := SystemBrowser findRespondersOfAll:allSelectors in:nil ignoreCase:false.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5583
    candidates remove:Object ifAbsent:[].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5584
    setOfTypes addAll:candidates.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5585
    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5586
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5587
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5588
addClassesOfBlockVarForWellknownBlocks:variableNode inScope:blockScope to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5589
    |blockParent blockParentSelector exNode isHandler|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5590
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5591
    blockParent := blockScope parent.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5592
    (blockParent notNil and:[blockParent isMessage]) ifFalse:[^ setOfTypes].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5593
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5594
    blockParentSelector := blockParent selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5595
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5596
    "/ 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
  5597
    "/ we know the type of argument.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5598
    ( #(do: keysAndValuesDo: select: collect:) includes:blockParent selector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5599
        |collection|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5600
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5601
        collection := self valueOfNode:blockParent receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5602
        collection notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5603
            (collection isKindOf:Collection) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5604
                collection notEmpty ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5605
                    |someElement|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5606
                    someElement := collection anElement.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5607
                    setOfTypes add:someElement class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5608
                    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5609
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5610
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5611
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5612
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5613
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5614
    "/ 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
  5615
    "/ 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
  5616
    ( blockParentSelector == #handle:do: ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5617
        exNode := blockParent receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5618
        isHandler := (blockScope == (blockParent arguments at:1)).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5619
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5620
    ( blockParentSelector == #on:do: ) ifTrue:[
5133
ea59e0c6f090 #BUGFIX by Maren
matilk
parents: 5131
diff changeset
  5621
"/        self halt.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5622
        exNode := blockParent arg1.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5623
        isHandler := (blockScope == (blockParent arguments at:2)).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5624
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5625
    exNode notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5626
        |cls exClass|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5627
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5628
        ((cls := (self valueOfNode:exNode)) notNil and:[cls isBehavior]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5629
            exClass := cls
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5630
        ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5631
            exClass := Exception
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5632
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5633
        setOfTypes add:exClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5634
        ^ self
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5635
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5636
    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5637
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5638
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5639
addClassesOfExpression:expr inClass:classOrNil to:setOfTypes
5486
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  5640
    |cls exprVal varName varScope instVarClass classVarClass poolVarClass sym
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  5641
     topNameSpace|
5131
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5642
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5643
    expr isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5644
        exprVal := expr value.
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5645
        cls := exprVal class.         
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5646
        (exprVal isArray or:[ exprVal isByteArray or:[ exprVal isString ]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5647
            exprVal isImmutable ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5648
                setOfTypes add:cls mutableClass.
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5649
                ^ setOfTypes.    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5650
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5651
        ].
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5652
        setOfTypes add:cls. 
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5653
        ^ setOfTypes.    
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5654
    ].
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5655
    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5656
    expr isBlock ifTrue:[
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5657
        setOfTypes add:Block. 
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5658
        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5659
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5660
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5661
    thisContext isRecursive ifTrue:[
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5662
        |count|
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5663
        count := 0.
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5664
        thisContext withAllSendersDo:[:c | (c selector == thisContext selector) ifTrue:[count := count + 1 ]].
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5665
        count > 10 ifTrue:[
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5666
            ^ setOfTypes
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5667
        ].
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5668
    ].
5131
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5669
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5670
    expr isVariable ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5671
        varName := expr name.
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  5672
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5673
        varName = 'self' ifTrue:[
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5674
            instanceOrNil notNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5675
                setOfTypes add:(instanceOrNil class).
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5676
            ] ifFalse:[    
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5677
                setOfTypes add:(classOrNil ? UndefinedObject).
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5678
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5679
            ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5680
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5681
        varName = 'super' ifTrue:[
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5682
            classOrNil isNil 
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5683
                ifTrue:[setOfTypes add:Object]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5684
                ifFalse:[setOfTypes add:classOrNil superclass].
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5685
            ^ setOfTypes.    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5686
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5687
        varName = 'thisContext' ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5688
            setOfTypes add:Context.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5689
            ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5690
        ].
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5691
        
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5692
        varScope := expr whoDefines: varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5693
        (varScope notNil) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5694
            varScope isSequence ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5695
                varScope := varScope parent.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5696
            ].
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5697
            
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5698
            (varScope isBlock) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5699
                self addClassesOfBlockVarForWellknownBlocks:expr inScope:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5700
                self addClassesFromAssignmentTo:varName in:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5701
                self addClassesFromMessagesSentTo:expr in:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5702
                ^ setOfTypes
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5703
            ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5704
            (varScope isMethod) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5705
                self addClassesFromAssignmentTo:varName in:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5706
                self addClassesFromMessagesSentTo:expr in:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5707
                ^ setOfTypes
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5708
            ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5709
        ].
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5710
        
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5711
        classOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5712
            "/ inst var
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5713
            instVarClass := classOrNil whichClassDefinesInstVar:varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5714
            instVarClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5715
                setOfTypes addAll:(self classesOfInstVarNamed:varName inClass:instVarClass).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5716
                ^ setOfTypes
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5717
            ].    
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5718
        
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5719
            "/ class vars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5720
            classVarClass := classOrNil theNonMetaclass whichClassDefinesClassVar:varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5721
            classVarClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5722
                "/ see what is currently there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5723
                setOfTypes add:(classVarClass classVarAt:varName asSymbol) class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5724
                ^ setOfTypes
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5725
            ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5726
            varName isUppercaseFirst ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5727
                "/ private class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5728
                varName knownAsSymbol ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5729
                    cls := classOrNil theNonMetaclass privateClassesAt:varName asSymbol.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5730
                    cls notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5731
                        setOfTypes add:(cls theMetaclass).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5732
                        ^ setOfTypes
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5733
                    ].    
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5734
                ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5735
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5736
            "/ pool vars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5737
            poolVarClass := classOrNil theNonMetaclass whichPoolDefinesPoolVar:varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5738
            poolVarClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5739
                "/ see what is currently there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5740
                setOfTypes add:(poolVarClass classVarAt:varName asSymbol) class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5741
                ^ setOfTypes
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5742
            ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5743
        ].
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5744
        
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5745
        varName isUppercaseFirst ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5746
            sym := varName asSymbolIfInterned.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5747
            sym notNil ifTrue:[
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5748
                (classOrNil isNil or:[(topNameSpace := classOrNil topNameSpace) isNil]) ifTrue:[
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5749
                    topNameSpace := Smalltalk.
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5750
                ].
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5751
                exprVal := topNameSpace at:sym.
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5752
                exprVal notNil ifTrue:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5753
                    setOfTypes add:(exprVal class).
5501
905b5a2216f7 #BUGFIX by mawalch
mawalch
parents: 5486
diff changeset
  5754
                ].
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5755
            ].        
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5756
        ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5757
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5758
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5759
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5760
    (exprVal := self valueOfNode:expr) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5761
        "/ knowing the value is always great!!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5762
        setOfTypes add:exprVal class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5763
        ^ setOfTypes.
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
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5766
    expr isMessage ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5767
        self addClassesOfMessage:expr inClass:classOrNil to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5768
        ^ setOfTypes
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5769
    ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5770
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5771
    ^ setOfTypes
5131
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5772
5486
56dd440a7ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  5773
    "Modified (comment): / 19-02-2017 / 14:03:29 / cg"
5502
427cef61298f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5501
diff changeset
  5774
    "Modified: / 24-02-2017 / 14:41:00 / stefan"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5775
!
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
addClassesOfInstVarNamed:varName inClass:aClass to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5778
    |instIndex type|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5779
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5780
    instIndex := aClass instVarIndexFor:varName.
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
    "/ ask the class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5783
    (type := aClass typeOfInstVarNamed:varName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5784
        type isCollection ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5785
            setOfTypes addAll:type.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5786
        ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5787
            setOfTypes add:type.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5788
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5789
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5790
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5791
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5792
    "/ look for instances
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5793
    aClass allSubInstancesDo:[:i |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5794
        |varClass|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5795
        varClass := (i instVarAt:instIndex) class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5796
        setOfTypes add:varClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5797
    ].  
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5798
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5799
    "/ look for assignments in code
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5800
    aClass withAllSubclassesDo:[:eachClass |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5801
        eachClass methodDictionary do:[:m |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5802
            |tree code visitor|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5803
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5804
            "/ quick check
5125
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5805
            SourceCodeManagerError handle:[:ex |
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5806
            ] do:[    
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5807
                code := m source.
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5808
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5809
            (code notNil and:[code includesString:varName]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5810
                tree := Parser parse:code class:eachClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5811
                (tree notNil and:[tree ~~ #Error]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5812
                    visitor := PluggableParseNodeVisitor new. 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5813
                    visitor 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5814
                        actionForNodeClass:AssignmentNode 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5815
                        put:[:node |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5816
                            |val expr exprSelector|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5817
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5818
                            node variable name = varName ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5819
                                expr := node expression.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5820
                                "/ only look for wellknown types on the right side.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5821
                                expr isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5822
                                    val := expr evaluate.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5823
                                    val isArray ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5824
                                        setOfTypes add:Array 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5825
                                    ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5826
                                        setOfTypes add:val class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5827
                                    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5828
                                ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5829
                                    expr isMessage ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5830
                                        exprSelector := expr selector. 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5831
                                        ( #(+ - * /) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5832
                                            setOfTypes add:Number
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5833
                                        ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5834
                                            ( #(// size) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5835
                                                setOfTypes add:Integer
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5836
                                            ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5837
                                                ( #(copy shallowCopy) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5838
                                                ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5839
                                                    ( #(new new: basicNew basicNew:) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5840
                                                        expr receiver isGlobal ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5841
                                                            setOfTypes add:expr receiver evaluate
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5842
                                                        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5843
                                                    ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5844
self breakPoint:#cg.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5845
                                                    ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5846
                                                ]
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
                                        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5849
                                    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5850
                                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5851
                            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5852
                            true "/ yes - visit subnodes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5853
                        ].        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5854
                    visitor visit:tree.
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
            ]    
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
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5859
    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5860
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5861
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5862
addClassesOfMessage:expr inClass:classOrNil to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5863
    |valClass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5864
     msgSelector msgReceiver msgArg1
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5865
     receiverClasses receiverClass 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5866
     arg1Classes arg1Value mthd|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5867
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5868
    msgSelector := expr selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5869
         
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5870
    "/ heuristic: quickly assume boolean for some:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5871
    (
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5872
        #( 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5873
            isNil notNil isEmpty isEmptyOrNil notEmpty notEmptyOrNil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5874
            > >= < <= = == ~ ~=
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5875
            knownAsSymbol
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5876
            isMeta 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5877
            includes: contains:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5878
            not and: or:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5879
            exists atEnd positive negative odd even
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5880
        ) includes:msgSelector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5881
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5882
        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
  5883
        ^ setOfTypes    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5884
    ].
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
    msgReceiver := expr receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5887
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5888
    "/ some hardwired knowledge here
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5889
    receiverClasses := self classesOfNode:msgReceiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5890
    receiverClass := receiverClasses size == 1 ifTrue:[receiverClasses anElement] ifFalse:[nil].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5891
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5892
    receiverClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5893
        "/ follow Smalltalk at: to see what is there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5894
        receiverClass == Smalltalk ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5895
            msgSelector == #at: ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5896
                msgArg1 := expr arg1.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5897
                msgArg1 isLiteralSymbol ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5898
                    arg1Value := Smalltalk at:msgArg1 value.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5899
                    arg1Value notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5900
                        setOfTypes add:arg1Value class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5901
                        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5902
                    ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5903
                ]    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5904
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5905
        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5906
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5907
        "/ usually return something of the receiver's type
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5908
        ( #(copy shallowCopy copyWith: , ) includes:msgSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5909
            setOfTypes addAll:receiverClasses.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5910
            ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5911
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5912
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5913
        ( msgSelector == #class ) ifTrue:[  
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5914
            setOfTypes add:(receiverClass class).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5915
            ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5916
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5917
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5918
        receiverClass isBehavior ifTrue:[                        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5919
            ( #(compiledMethodAt:) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5920
                setOfTypes add:Method.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5921
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5922
            ].            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5923
            ( #(superclass) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5924
                receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5925
                    setOfTypes add:Metaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5926
                ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5927
                    setOfTypes add:Class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5928
                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5929
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5930
            ].            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5931
            ( #(theNonMetaclass theMetaclass) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5932
                receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5933
                    setOfTypes add:Metaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5934
                    ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5935
                ].
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  5936
                setOfTypes add:(receiverClass perform:msgSelector asSymbol) class.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5937
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5938
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5939
            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5940
            mthd := receiverClass lookupMethodFor:msgSelector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5941
            receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5942
                ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: msgSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5943
                    setOfTypes add:receiverClass theNonMetaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5944
                    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5945
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5946
                "/ 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
  5947
                mthd notNil ifTrue:[
5451
32ed77c9d198 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5419
diff changeset
  5948
                    ( mthd sendsAnySelector:#( #'new' #'basicNew' #'new:' #'basicNew:' )) ifTrue:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5949
                        setOfTypes add:receiverClass theNonMetaclass.
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
            ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5954
                mthd notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5955
                    (ParseTreeSearcher methodIsSetterMethod:mthd) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5956
                        setOfTypes add:receiverClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5957
                        ^ setOfTypes
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
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5961
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5962
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5963
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5964
    ((msgSelector startsWith:'as')
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5965
    and:[ (valClass := Smalltalk classNamed:(msgSelector copyFrom:3)) notNil ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5966
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5967
        setOfTypes add:valClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5968
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5969
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5970
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5971
    ((msgSelector startsWith:'is')
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5972
    and:[ (valClass := Smalltalk classNamed:(msgSelector copyFrom:3)) notNil ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5973
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5974
        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
  5975
        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5976
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5977
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
        size                    SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5980
        hash                    SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5981
        identityHash            SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5982
        class                   Class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5983
        theMetaclass            Metaclass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5984
        theNonMetaclass         Class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5985
        fork                    Process
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5986
        newProcess              Process
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5987
    ) pairWiseDo:[:sel :clsName |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5988
        msgSelector == sel ifTrue:[ 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5989
            setOfTypes add:(Smalltalk at:clsName).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5990
            ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5991
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5992
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5993
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5994
    ( #( bitAnd: bitOr: bitShift: rightShift: >> << highBit lowBit ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5995
        "/ assume integer
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5996
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5997
        setOfTypes add:Integer.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5998
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5999
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6000
    ( #( + - * // \\ ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6001
        "/ assume numeric
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6002
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6003
        setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6004
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6005
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6006
    msgSelector == #/ ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6007
        ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Number]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6008
            setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6009
            ^ setOfTypes.
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
        msgArg1 := expr arguments at:1 ifAbsent:nil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6012
        msgArg1 isNil ifTrue:[^ setOfTypes].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6013
        arg1Classes := ((self classesOfNode:msgArg1) ? #()).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6014
        (arg1Classes contains:[:cls | cls includesBehavior:Number]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6015
            setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6016
            ^ setOfTypes
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
    ( #( construct: / ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6020
        ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Filename]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6021
            setOfTypes add:Filename.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6022
            ^ setOfTypes
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
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6026
    ^ setOfTypes
5451
32ed77c9d198 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5419
diff changeset
  6027
5462
6a7b577cd2b9 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5453
diff changeset
  6028
    "Modified: / 10-02-2017 / 10:39:41 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6029
!
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
classOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6032
    "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
  6033
     Otherwise nil (either unknown, or multiple possibilities)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6034
     When showing possible completions for a message,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6035
     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
  6036
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6037
    | classes |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6038
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6039
    classes := self classesOfNode:aNode.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6040
    classes size == 1 ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6041
        ^ classes anElement
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6042
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6043
    self breakPoint:#cg.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6044
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6045
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6046
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6047
classesFromAssignmentTo:varName in:aTree
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6048
    ^ self addClassesFromAssignmentTo:varName in:aTree to:IdentitySet new
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6049
!
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
classesOfInstVarNamed:varName inClass:aClass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6052
    ^ self addClassesOfInstVarNamed:varName inClass:aClass to:(IdentitySet new)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6053
!
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
classesOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6056
    "returns the set of possible classes of a parsenode.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6057
     or nil if unknown.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6058
     When showing possible completions for a message,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6059
     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
  6060
5453
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6061
    |dict|
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6062
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6063
    dict := IdentitySet new.
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6064
    self addClassesOfExpression:aNode inClass:classOrNil to:dict.
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6065
    ^ dict.
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6066
4e5f952f555d #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5451
diff changeset
  6067
    "Modified: / 05-02-2017 / 12:40:16 / cg"
5109
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
isNonDestructive:aMessageNode whenSentTo:receiverValue
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6071
    "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
  6072
     (i.e. has no side effects)"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6073
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6074
    |selector method impl arg1Value|
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
    selector := aMessageNode selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6077
    impl := receiverValue class whichClassIncludesSelector:selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6078
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
        basicSize basicAt:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6081
        class theMetaclass theNonMetaclass ) includes:selector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6082
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6083
        ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6084
    ].    
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
    selector == #size ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6087
        "/ mhm - be conservative; someone might have redefined #size
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6088
        "/ more hardwired stuff.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6089
        ((impl == Object) or:[(impl == String) or:[impl isSubclassOf:Collection]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6090
            ^ true.
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
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6093
    selector == #at: ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6094
        "/ 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
  6095
        "/ more hardwired stuff.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6096
        arg1Value := self valueOfNode:(aMessageNode arg1).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6097
        arg1Value notNil ifTrue:[            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6098
            receiverValue == Smalltalk ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6099
                ^ arg1Value isSymbol
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6100
            ].    
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
            ((impl == Object) or:[(impl == String) or:[(impl isSubclassOf:Collection)]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6103
                ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6104
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6105
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6106
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6107
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6108
    selector argumentCount == 0 ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6109
        "/ follow non-destructive accessors
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6110
        method := receiverValue class lookupMethodFor:selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6111
        method notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6112
            (ParseTreeSearcher methodIsJustReturningSomething:method) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6113
                "/ 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
  6114
                ^ true.
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
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6117
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6118
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6119
    ^ false
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6120
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6121
    "Modified: / 09-03-2017 / 10:58:50 / cg"
5109
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
valueAndKindOfVariable:aVariableName
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6125
    "when showing possible completions for a variable,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6126
     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
  6127
     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
  6128
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6129
    |nodeVal con classInstVarClass classVarClass privateClass pool sym nameSpace topNameSpace|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6130
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6131
    aVariableName isUppercaseFirst ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6132
        classOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6133
            classOrNil isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6134
                "/ class instVars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6135
                (classInstVarClass := classOrNil whichClassDefinesInstVar:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6136
                    nodeVal := classInstVarClass theNonMetaclass instVarNamed:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6137
                    ^ { nodeVal . #classInstVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6138
                ].    
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
            "/ class vars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6141
            (classVarClass := classOrNil theNonMetaclass whichClassDefinesClassVar:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6142
                nodeVal := classVarClass classVarAt:aVariableName asSymbol.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6143
                ^ { nodeVal . #classVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6144
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6145
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6146
            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
  6147
            privateClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6148
                nodeVal := privateClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6149
                ^ { nodeVal . #privateClass }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6150
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6151
            pool := classOrNil theNonMetaclass whichPoolDefinesPoolVar:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6152
            pool notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6153
                nodeVal := pool classVarAt:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6154
                ^ { nodeVal . #poolVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6155
            ].
5118
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6156
            (sym := aVariableName asSymbolIfInterned) notNil ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6157
                ((nameSpace := classOrNil nameSpace) notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6158
                    nameSpace isNameSpace ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6159
                        nodeVal := nameSpace at:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6160
                        (nodeVal notNil or:[nameSpace includesKey:sym]) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6161
                            ^ { nodeVal . #nameSpaceVariable }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6162
                        ].
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6163
                    ].
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6164
                    nodeVal := nameSpace privateClassNamed:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6165
                    (nodeVal notNil) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6166
                        ^ { nodeVal . #privateClass }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6167
                    ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6168
                ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6169
                ((topNameSpace := classOrNil topNameSpace) notNil 
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6170
                and:[topNameSpace ~~ nameSpace
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6171
                and:[topNameSpace ~~ Smalltalk]]) ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6172
                    nodeVal := topNameSpace at:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6173
                    (nodeVal notNil or:[topNameSpace includesKey:sym]) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6174
                        ^ { nodeVal . #nameSpaceVariable }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6175
                    ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6176
                ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6177
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6178
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6179
        (sym := aVariableName asSymbolIfInterned) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6180
            nodeVal := Smalltalk at:sym.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6181
            (nodeVal notNil or:[Smalltalk includesKey:sym]) ifTrue:[     
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6182
                ^ { nodeVal . #global }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6183
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6184
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6185
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6186
        "/ 'evaluate' the variable (like in a browser's codeView)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6187
        "/ mhmh - will we catch workspace vars then?
5118
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6188
        Error ignoreIn:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6189
            nodeVal := Parser new evaluate:aVariableName in:classOrNil receiver:classOrNil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6190
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6191
        nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6192
            ^ { nodeVal . #global }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6193
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6194
        ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6195
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6196
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6197
    aVariableName = 'self' ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6198
        contextOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6199
            ^ { contextOrNil receiver . #pseudoVar } 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6200
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6201
        (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6202
            "/ ^ { classOrNil . #pseudoVar }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6203
            ^ { classOrNil theNonMetaclass . #pseudoVar }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6204
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6205
        ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6206
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6207
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6208
    contextOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6209
        "/ in the debugger, we know more
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6210
        con := contextOrNil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6211
        [ con notNil ] whileTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6212
            "/ a local in the context?
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6213
            ((con argAndVarNames ? #()) includes:aVariableName) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6214
                nodeVal := con argsAndVars at:(con argAndVarNames indexOf:aVariableName) ifAbsent:nil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6215
                nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6216
                    ^ { nodeVal . #argument }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6217
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6218
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6219
            con := con home.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6220
        ].
5370
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6221
        "/ an instvar?
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6222
        (contextOrNil receiver class allInstVarNames includes:aVariableName) ifTrue:[
5370
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6223
            contextOrNil receiver isProtoObject ifFalse:[
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6224
                nodeVal := contextOrNil receiver instVarNamed:aVariableName.
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6225
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6226
            nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6227
                ^ { nodeVal . #instanceVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6228
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6229
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6230
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6231
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6232
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6233
    "Created: / 01-05-2016 / 12:40:05 / cg"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6234
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6235
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6236
valueOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6237
    "when showing possible completions for a message,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6238
     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
  6239
     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
  6240
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6241
    |nodeSelector nodeReceiver receiverValue arg1Value|
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6242
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6243
    aNode isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6244
        ^ aNode value
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6245
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6246
    aNode isVariable ifTrue:[
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6247
        aNode isSelf ifTrue:[
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6248
            instanceOrNil notNil ifTrue:[
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6249
                ^ instanceOrNil
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6250
            ].    
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6251
        ].    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6252
        ^ self valueOfVariable:aNode name.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6253
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6254
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6255
    aNode isMessage ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6256
        nodeSelector := aNode selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6257
        nodeReceiver := aNode receiver.
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6258
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6259
        "/ some hardwired knowledge here
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6260
        classOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6261
            (nodeReceiver isSelf and:[nodeSelector = #'class']) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6262
                ^ classOrNil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6263
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6264
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6265
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6266
        receiverValue := self valueOfNode:nodeReceiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6267
        receiverValue notNil ifTrue:[
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6268
            (self isNonDestructive:aNode whenSentTo:receiverValue) ifTrue:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6269
                [
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6270
                     nodeSelector argumentCount == 1 ifTrue:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6271
                        arg1Value := self valueOfNode:(aNode arg1).
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6272
                        ^ receiverValue perform: nodeSelector with: arg1Value.
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6273
                    ].    
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6274
                    ^ receiverValue perform: nodeSelector.
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6275
                ] on:Error do:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6276
                    ^ nil
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6277
                ]    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6278
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6279
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6280
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6281
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6282
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6283
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6284
    "Created: / 28-08-2013 / 16:34:53 / cg"
5512
4375d3732703 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5509
diff changeset
  6285
    "Modified: / 09-03-2017 / 10:58:42 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6286
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6287
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6288
valueOfVariable:aVariableName
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6289
    "when showing possible completions for a variable,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6290
     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
  6291
     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
  6292
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6293
    |valueAndKind|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6294
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6295
    (valueAndKind := self valueAndKindOfVariable:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6296
        self assert:valueAndKind isArray.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6297
        ^ valueAndKind first.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6298
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6299
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6300
5225
8bcca5a042c5 #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 5224
diff changeset
  6301
    "Modified: / 26-08-2016 / 14:16:16 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6302
! !
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6303
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6304
!DoWhatIMeanSupport::InputCompletionResult class methodsFor:'instance creation'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6305
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6306
bestName:bestNameArg matchingNames:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6307
    ^ self with:bestNameArg with:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6308
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6309
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6310
     self bestName:123 matchingNames:345
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6311
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6312
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6313
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6314
!DoWhatIMeanSupport::InputCompletionResult methodsFor:'accessing'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6315
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6316
bestName
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6317
    ^ self at:1
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6318
!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6319
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6320
matchingNames
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6321
    ^ self at:2
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6322
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6323
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6324
!DoWhatIMeanSupport class methodsFor:'documentation'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6325
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6326
version
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  6327
    ^ '$Header$'
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6328
!
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6329
3761
6584390d427d dont forget pool variables when looking for the best variable match
Claus Gittinger <cg@exept.de>
parents: 3751
diff changeset
  6330
version_CVS
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  6331
    ^ '$Header$'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6332
! !
4194
e677aae984be Refactoring:
Stefan Vogel <sv@exept.de>
parents: 4148
diff changeset
  6333