DoWhatIMeanSupport.st
author Claus Gittinger <cg@exept.de>
Sat, 07 May 2016 12:37:59 +0200
changeset 5080 0842b08b7040
parent 5076 9d8cf635a6cb
child 5081 5478311e8ee5
permissions -rw-r--r--
#UI_ENHANCEMENT by cg class: DoWhatIMeanSupport added:7 methods changed:12 methods
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
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
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
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
    17
	instanceVariableNames:'tree tokens languageOrNil classOrNil methodOrNil contextOrNil
4434
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
    18
		instanceOrNil codeView rememberedScopeNodes rememberedNodes
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
    19
		codeAspect'
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
    20
	classVariableNames:'LastSource LastParseTree LastScanTokens LastChoices
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
    21
		LastCompletedSelectors Verbose'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	poolDictionaries:''
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
	category:'System-Support'
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
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    27
	instanceVariableNames:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    28
	classVariableNames:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    29
	poolDictionaries:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    30
	privateIn:DoWhatIMeanSupport
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
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
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:
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    60
	1) not needed for standalone executables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
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:]
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
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
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
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
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   126
	codeCompletionForMethod:methodOrNil orClass:classOrNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   127
	context:contextOrNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
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
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   134
    ^ self new findNodeForInterval:interval in:source
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   135
!
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   136
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   137
findNodeForInterval:interval in:source allowErrors:allowErrors
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   138
    ^ self new findNodeForInterval:interval in:source allowErrors:allowErrors
4080
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   139
!
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   140
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   141
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   142
    "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
   143
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   144
    ^ self new
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   145
	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
   146
!
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   147
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   148
findNodeForInterval:interval inParseTree:parseTree
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   149
    ^ 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
   150
!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   151
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   152
findNodeIn:tree forInterval:interval
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   153
    ^ self new findNodeIn:tree forInterval:interval
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   156
!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
   157
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   158
classCategoryCompletion:aPartialCategory inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   159
    "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
   160
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   161
		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
   162
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   163
    |matches best lcName|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   164
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   165
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   166
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   167
    "/ search for exact match
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   168
    anEnvironment allClassesDo:[:aClass |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   169
	|category|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   170
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   171
	category := aClass category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   172
	(category notNil and:[category startsWith:aPartialCategory]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   173
	    matches add:category
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   174
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   175
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   176
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   177
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   178
	lcName := aPartialCategory asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   179
	anEnvironment allClassesDo:[:aClass |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   180
	    |category|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   181
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   182
	    category := aClass category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   183
	    (category notNil and:[category asLowercase startsWith:lcName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   184
		matches add:category
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   185
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   186
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   187
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   188
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   189
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   190
	^ 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
   191
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   192
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   193
	^ 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
   194
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   195
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   196
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   197
    ^ 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
   198
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   199
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   200
     Smalltalk classCategoryCompletion:'Sys'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   201
     Smalltalk classCategoryCompletion:'System'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   202
     Smalltalk classCategoryCompletion:'System-BinaryStorage'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   203
    "
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   204
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   205
    "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
   206
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   207
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   208
classNameEntryCompletionBlock
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   209
    "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
   210
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   211
    ^ self entryCompletionBlockFor:#'classnameCompletion:inEnvironment:'
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   212
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   213
    "Modified: / 10-08-2006 / 13:22:02 / cg"
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   214
!
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   215
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   216
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
   217
    "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
   218
     2 entries: 1st: the best (longest) match
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   219
                2nd: collection consisting of matching names"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   220
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   221
    |searchName matches matchedNamesWithoutPrefix ignCaseMatches best isMatchString cls nsPrefix
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   222
     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
   223
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   224
    (words := aPartialClassName asCollectionOfWords) size > 1 ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   225
        w1 := words first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   226
        w2 := words second.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   227
        rslt := self classnameCompletion:w1 filter:filterBlock inEnvironment:anEnvironment.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   228
        bestMatch := rslt first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   229
        matches := rslt second.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   230
        ('class' copyTo:(w2 size min:5)) = w2 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   231
            matches := matches collect:[:m | m , ' class'].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   232
            bestMatch := bestMatch , ' class'.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   233
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   234
        ^ InputCompletionResult bestName:bestMatch matchingNames:matches
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   235
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   236
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   237
    (aPartialClassName startsWith:'Smalltalk::') ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   238
        nsPrefix := 'Smalltalk::'.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   239
        searchName := aPartialClassName withoutPrefix:'Smalltalk::'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   240
    ] ifFalse:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   241
        nsPrefix := ''.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   242
        searchName := aPartialClassName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   243
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   244
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   245
    searchName := searchName asUppercaseFirst.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   246
    lcSearchName := searchName asLowercase.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   247
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   248
    isMatchString := searchName includesMatchCharacters.
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   249
    (searchName size > 2 
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   250
        and:[ searchName first = $* 
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   251
        and:[ searchName last = $* ]]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   252
    ) ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   253
        isMatchString := false.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   254
        searchName := searchName unquote:$*.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   255
    ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   256
    
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   257
    searchName isEmpty ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   258
        matches := Smalltalk allClassesForWhich:filterBlock.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   259
        ^ InputCompletionResult bestName:searchName matchingNames:#()
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   260
    ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   261
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   262
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   263
    matchedNamesWithoutPrefix := Set new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   264
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   265
    others := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   266
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   267
    tryToMatch :=
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   268
        [:className :fullClassName|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   269
            |addIt|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   270
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   271
            isMatchString ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   272
                addIt := searchName match:className
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   273
            ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   274
                addIt := className includesString:searchName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   275
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   276
            addIt ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   277
                matches add:(nsPrefix , fullClassName).
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   278
                matchedNamesWithoutPrefix add:className.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   279
            ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   280
                "/ try ignoring case
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   281
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   282
                isMatchString ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   283
                    addIt := searchName match:className caseSensitive:false
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   284
                ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   285
                    addIt := className includesString:lcSearchName caseSensitive:false.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   286
                    addIt ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   287
                        others add:className
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   288
                    ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   289
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   290
                addIt ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   291
                    ignCaseMatches add:(nsPrefix , fullClassName).
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   292
                    matchedNamesWithoutPrefix add:className.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   293
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   294
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   295
            addIt
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   296
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   297
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   298
    anEnvironment allClassesForWhich:filterBlock do:[:aClass |
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   299
        |addIt fullClassName classNameWithoutPrefix|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   300
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   301
        aClass isMeta ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   302
            fullClassName := aClass name.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   303
            classNameWithoutPrefix := aClass nameWithoutPrefix.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   304
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   305
            addIt := tryToMatch value:fullClassName value:fullClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   306
            addIt ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   307
                classNameWithoutPrefix ~~ fullClassName ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   308
                    tryToMatch value:classNameWithoutPrefix value:fullClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   309
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   310
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   311
        ]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   312
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   313
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   314
"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   315
"/        matches := ignCaseMatches.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   316
"/    ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   317
    matches := matches , ignCaseMatches.
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   318
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   319
"/    matches isEmpty ifTrue:[
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   320
"/        matches := ignCaseMatches.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   321
"/
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   322
"/"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   323
"/"/        | nearBy |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   324
"/"/        nearBy := SortedCollection new sortBlock:[:a :b | a key < b key].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   325
"/"/        others do:[:className |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   326
"/"/            |lcClassName dist cmpName|
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   327
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   328
"/"/            lcClassName := className asLowercase.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   329
"/"/            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
   330
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   331
"/"/            cmpName := lcClassName copyTo:(lcSearchName size min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   332
"/"/            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
   333
"/"/            cmpName := lcClassName copyTo:(lcSearchName size + 1 min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   334
"/"/            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
   335
"/"/            dist < 4 ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   336
"/"/                nearBy add:( dist -> (nsPrefix , className) ).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   337
"/"/            ]
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   338
"/"/        ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   339
"/"/        matches := nearBy collect:[:eachPair | eachPair value].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   340
"/"/    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   341
"/    ].
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   342
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   343
    matches isEmpty ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   344
        ^ InputCompletionResult bestName:searchName matchingNames:(Array with:searchName)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   345
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   346
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   347
    matches size == 1 ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   348
        best := matches first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   349
        ^ 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
   350
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   351
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   352
    matches
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   353
        sort:[:name1 :name2 |
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   354
            "name1 comes before:name2 iff"
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   355
            ((name2 includes:$:) and:[(name1 includes:$:) not])
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   356
            or:[ ((name1 includes:$:) == (name2 includes:$:))
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   357
                  and:[ (name1 size < name2 size)
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   358
                        or: [ name1 < name2 ]]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   359
               ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   360
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   361
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   362
    isMatchString ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   363
        best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   364
    ] ifFalse:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   365
        matchesForLongestPrefix := matches select:[:m | m asLowercase startsWith:lcSearchName].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   366
        best := ignCaseMatches isEmpty
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   367
                    ifTrue:[ matchesForLongestPrefix longestCommonPrefix ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   368
                    ifFalse:[ matchesForLongestPrefix longestCommonPrefixCaseSensitive:false ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   369
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   370
        best size < aPartialClassName size "best size == 0" ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   371
            best := matchedNamesWithoutPrefix longestCommonPrefix.
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
        best size == 0 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   374
            "if tried again, return next match"
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   375
            idx := ((matches indexOf:aPartialClassName) + 1) \\ matches size.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   376
            idx ~~ 1 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   377
                ^ InputCompletionResult bestName:(matches at:idx) matchingNames:(matches asArray)
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   378
            ].
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
        best size < aPartialClassName size ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   381
            best := aPartialClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   382
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   383
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   384
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   385
    cls := anEnvironment classNamed:best.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   386
    (cls isBehavior and:[cls isNameSpace]) ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   387
        (matches conform:[:each | each = best
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   388
                                 or:[each startsWith:(best , '::')]])
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   389
        ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   390
            best := best , '::'
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   391
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   392
    ].
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   393
    ^ 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
   394
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   395
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   396
     Smalltalk classnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   397
     Smalltalk classnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   398
     Smalltalk classnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   399
     Smalltalk classnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   400
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   401
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   402
    "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
   403
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   404
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   405
classnameCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   406
    "given a partial classname, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   407
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   408
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   409
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   410
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   411
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   412
	filter:[:cls | true]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   413
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   414
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   415
    "
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   416
     self classnameCompletion:'Arr'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   417
     self classnameCompletion:'Arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   418
     self classnameCompletion:'arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   419
     self classnameCompletion:'*rray' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   420
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   421
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   422
    "Created: / 24-11-1995 / 17:24:45 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   423
    "Modified: / 10-08-2006 / 13:01:30 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   424
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   425
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   426
entryCompletionBlockFor:completionSelector
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   427
    "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
   428
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   429
    ^ [:contents :field  |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   430
	  |s what m|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   431
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   432
	  s := contents withoutSpaces.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   433
	  field topView withCursor:(Cursor questionMark) do:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   434
	      what := self perform:completionSelector with:s with:Smalltalk.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   435
	  ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   436
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   437
	  field contents:(what first).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   438
	  (what at:2) size ~~ 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   439
	      UserPreferences current beepInEditor ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   440
		field device beep
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   441
	      ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   442
	  ]
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   443
      ].
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   444
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   445
    "Created: / 10-08-2006 / 13:21:37 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   446
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   447
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   448
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   449
    "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
   450
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   451
		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
   452
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   453
    ^ self globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:true
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   454
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   455
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   456
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   457
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   458
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   459
     Smalltalk globalnameCompletion:'*rray'
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   460
    "
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   461
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   462
    "Created: / 10-08-2006 / 13:06:23 / cg"
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   463
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   464
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   465
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   466
    "given a partial globalName, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   467
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   468
		2nd: collection consisting of matching names"
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   469
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   470
    |searchName matches ignCaseMatches best isMatchString|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   471
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   472
    searchName := aPartialGlobalName.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   473
    searchName isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   474
	^ Array with:searchName with:#()
2661
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
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   477
    (searchName at:1) isLowercase ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   478
	searchName := searchName copy asUppercaseFirst
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   479
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   480
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   481
    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
   482
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   483
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   484
    anEnvironment keysDo:[:aGlobalName |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   485
	| addIt|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   486
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   487
	isMatchString ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   488
	    addIt := searchName match:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   489
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   490
	    addIt := aGlobalName startsWith:searchName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   491
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   492
	addIt ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   493
	    matches add:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   494
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   495
	    "/ try ignoring case
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   496
	    isMatchString ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   497
		addIt := searchName match:aGlobalName caseSensitive:false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   498
	    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   499
		addIt := aGlobalName asLowercase startsWith:searchName asLowercase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   500
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   501
	    addIt ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   502
		ignCaseMatches add:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   503
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   504
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   505
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   506
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   507
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   508
	matches := ignCaseMatches
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   509
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   510
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   511
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   512
	^ 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
   513
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   514
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   515
	^ 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
   516
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   517
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   518
    isMatchString ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   519
	best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   520
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   521
	best := matches longestCommonPrefix.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   522
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   523
    ^ 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
   524
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   525
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   526
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   527
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   528
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   529
     Smalltalk globalnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   530
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   531
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   532
    "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
   533
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   534
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   535
methodProtocolCompletion:aPartialProtocolName inEnvironment:anEnvironment
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   536
    "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
   537
     2 entries: 1st: the best (longest) match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   538
		2nd: collection consisting of matching protocols"
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   539
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   540
    |matches best lcName|
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   541
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   542
    matches := IdentitySet new.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   543
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   544
    "/ search for exact match
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   545
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   546
	|protocol|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   547
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   548
	protocol := eachMethod category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   549
	(protocol notNil and:[protocol startsWith:aPartialProtocolName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   550
	    matches add:protocol
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   551
	].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   552
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   553
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   554
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   555
	lcName := aPartialProtocolName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   556
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   557
	    |protocol|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   558
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   559
	    protocol := eachMethod category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   560
	    (protocol notNil and:[protocol asLowercase startsWith:lcName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   561
		matches add:protocol
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   562
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   563
	].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   564
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   565
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   566
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   567
	^ Array with:aPartialProtocolName with:(Array with:aPartialProtocolName)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   568
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   569
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   570
	^ Array with:matches first with:(matches asArray)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   571
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   572
    matches := matches asSortedCollection.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   573
    best := matches longestCommonPrefix.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   574
    ^ Array with:best with:matches asArray
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   575
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   576
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   577
     Smalltalk methodProtocolCompletion:'doc'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   578
     Smalltalk methodProtocolCompletion:'docu'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   579
     Smalltalk methodProtocolCompletion:'documenta'
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   580
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   581
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   582
    "Created: / 10-08-2006 / 13:05:27 / cg"
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   583
    "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
   584
!
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   585
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   586
nameSpaceCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   587
    "given a partial name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   588
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   589
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   590
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   591
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   592
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   593
	filter:[:cls | cls isNameSpace]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   594
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   595
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   596
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   597
     DoWhatIMeanSupport nameSpaceCompletion:'To'  inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   598
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   599
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   600
    "Created: / 10-08-2006 / 13:02:16 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   601
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   602
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   603
packageCompletion:aPartialPackage inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   604
    "given a partial package name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   605
     2 entries: 1st: the best (longest) match
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   606
                2nd: collection consisting of matching packages"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   607
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   608
    |matches best lcName|
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   609
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   610
    matches := Smalltalk allPackageIDs
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   611
        select:[:package | package startsWith:aPartialPackage].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   612
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   613
    matches isEmpty ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   614
        "/ search for case-ignoring match
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   615
        lcName := aPartialPackage asLowercase.
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   616
        anEnvironment allClassesDo:[:aClass |
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   617
            |package|
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   618
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   619
            package := aClass package.
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   620
            (package notNil and:[package asLowercase startsWith:lcName]) ifTrue:[
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   621
                matches add:package
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   622
            ].
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   623
        ].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   624
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   625
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   626
    matches isEmpty ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   627
        ^ Array with:aPartialPackage with:(Array with:aPartialPackage)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   628
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   629
    matches size == 1 ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   630
        ^ Array with:matches first with:(matches asArray)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   631
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   632
    matches := matches asSortedCollection.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   633
    best := matches longestCommonPrefix.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   634
    ^ Array with:best with:matches asArray
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   635
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   636
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   637
     DoWhatIMeanSupport packageCompletion:'stx:' inEnvironment:Smalltalk
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   638
     DoWhatIMeanSupport packageCompletion:'stx:libw' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   639
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   640
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   641
    "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
   642
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   643
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   644
packageNameEntryCompletionBlock
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   645
    "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
   646
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   647
    ^ self entryCompletionBlockFor:#'packageCompletion:inEnvironment:'
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   648
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   649
    "Created: / 10-08-2006 / 13:22:31 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   650
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   651
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   652
poolnameCompletion:aPartialClassName inEnvironment:anEnvironment
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   653
    "given a partial poolname, return an array consisting of
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   654
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   655
		2nd: collection consisting of matching names"
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   656
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   657
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   658
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   659
	filter:[:cls | cls isSharedPool]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   660
	inEnvironment:anEnvironment
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   661
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   662
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   663
     self poolnameCompletion:'Win' inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   664
     self poolnameCompletion:'Z'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   665
     self poolnameCompletion:'a'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   666
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   667
!
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   668
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   669
resourceCompletion:aPartialResourceName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   670
    "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
   671
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   672
		2nd: collection consisting of matching defined resources"
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   673
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   674
    |matches best lcSym isMatch|
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   675
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   676
    matches := IdentitySet new.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   677
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   678
    isMatch := doMatch and:[aPartialResourceName includesMatchCharacters].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   679
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   680
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   681
	eachMethod hasResource ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   682
	    eachMethod resources keysDo:[:eachResourceName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   683
		(isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   684
		    ifTrue:[ (aPartialResourceName match:eachResourceName caseSensitive:ignoreCase not) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   685
		    ifFalse:[ ignoreCase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   686
				ifTrue:[ (eachResourceName asLowercase startsWith:aPartialResourceName asLowercase) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   687
				ifFalse:[ (eachResourceName startsWith:aPartialResourceName) ] ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   688
		) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   689
		    matches add:eachResourceName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   690
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   691
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   692
	].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   693
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   694
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   695
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   696
	lcSym := aPartialResourceName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   697
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   698
	    eachMethod hasResource ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   699
		eachMethod resources keysDo:[:eachResourceName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   700
		    (isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   701
			ifTrue:[ (aPartialResourceName match:eachResourceName caseSensitive:false) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   702
			ifFalse:[ (eachResourceName asLowercase startsWith:lcSym) ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   703
		     ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   704
			matches add:eachResourceName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   705
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   706
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   707
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   708
	].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   709
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   710
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   711
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   712
	^ Array with:aPartialResourceName with:#()
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   713
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   714
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   715
	^ Array with:matches first with:(matches asArray)
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   716
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   717
    matches := matches asSortedCollection.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   718
    best := matches longestCommonPrefix.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   719
    ^ Array with:best with:matches asArray
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   720
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   721
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   722
     DoWhatIMeanSupport resourceCompletion:'*debug*' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   723
     DoWhatIMeanSupport resourceCompletion:'context' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   724
     DoWhatIMeanSupport resourceCompletion:'key' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   725
     DoWhatIMeanSupport resourceCompletion:'cont' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   726
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   727
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   728
    "Created: / 06-07-2011 / 12:04:41 / cg"
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   729
!
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   730
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   731
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   732
    "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
   733
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   734
		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
   735
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   736
    ^ self selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:false
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   737
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   738
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   739
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   740
    "given a partial selector, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   741
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   742
		2nd: collection consisting of matching implemented selectors"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   743
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   744
    ^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   745
	selectorCompletion:aPartialSymbolName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   746
	inEnvironment:anEnvironment
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   747
	match:doMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   748
	ignoreCase:false
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   749
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   750
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   751
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   752
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   753
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   754
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   755
     DoWhatIMeanSupport selectorCompletion:'nextp' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   756
    "
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   757
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   758
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   759
    "Modified: / 26-10-2010 / 20:30:27 / cg"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   760
!
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   761
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   762
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   763
    "given a partial selector, return an array consisting of
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   764
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   765
		2nd: collection consisting of matching implemented selectors"
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   766
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   767
    |matches best lcSym isMatch|
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   768
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   769
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   770
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   771
    isMatch := doMatch and:[aPartialSymbolName includesMatchCharacters].
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   772
3751
eafbe64ab0fc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3734
diff changeset
   773
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   774
	(isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   775
	    ifTrue:[ (aPartialSymbolName match:eachSelector caseSensitive:ignoreCase not) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   776
	    ifFalse:[ ignoreCase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   777
			ifTrue:[ (eachSelector asLowercase startsWith:aPartialSymbolName asLowercase) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   778
			ifFalse:[ (eachSelector startsWith:aPartialSymbolName) ] ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   779
	 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   780
	    matches add:eachSelector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   781
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   782
    ].
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   783
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   784
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   785
	lcSym := aPartialSymbolName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   786
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   787
	    (isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   788
		ifTrue:[ (aPartialSymbolName match:eachSelector caseSensitive:false) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   789
		ifFalse:[ (eachSelector asLowercase startsWith:lcSym) ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   790
	     ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   791
		matches add:eachSelector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   792
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   793
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   794
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   795
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   796
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   797
	^ 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
   798
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   799
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   800
	^ 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
   801
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   802
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   803
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   804
    ^ 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
   805
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   806
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   807
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   808
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   809
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3867
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   810
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   811
     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
   812
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   813
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   814
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   815
    "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
   816
! !
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   817
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
!DoWhatIMeanSupport class methodsFor:'rename support'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   819
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
goodRenameDefaultFor:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   821
    "generate a reasonable default for a rename operation.
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   822
     (used for rename category etc.)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
   823
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   824
    |prefix suffix lastNewSize lastOldSize left right inserted deleted tryAgain|
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   825
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   826
    lastNewName isNil ifTrue:[ ^ nil].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   827
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   828
    lastNewSize := lastNewName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   829
    lastOldSize := lastOldName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   830
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
    (lastNewName endsWith:lastOldName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   832
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   833
	    'foo' -> 'Xfoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   834
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   835
	    'bar' would be 'Xbar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   836
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   837
	prefix := lastNewName copyTo:(lastNewSize - lastOldSize).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   838
	^ (prefix , oldName).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
    (lastOldName endsWith:lastNewName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   841
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   842
	    'Xfoo' -> 'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   843
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   844
	    'Xbar' would be 'bar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   845
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   846
	prefix := lastOldName copyTo:(lastOldSize - lastNewSize).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   847
	(oldName startsWith:prefix) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   848
	    ^ (oldName copyFrom:prefix size+1).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   849
	]
2514
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   850
    ].
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   851
    (lastOldName asLowercase = lastNewName asLowercase) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   852
	(lastOldName first ~= lastNewName first) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   853
	    (lastOldName first isLowercase = oldName first isLowercase) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   854
		"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   855
		    'xfoo' -> 'Xfoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   856
		 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   857
		    'xbar' would be 'Xbar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   858
		"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   859
		lastOldName first isLowercase ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   860
		    ^ oldName asUppercaseFirst "oldName first asUppercase asString , (oldName copyFrom:2)".
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   861
		] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   862
		    ^ oldName asLowercaseFirst "oldName first asLowercase asString , (oldName copyFrom:2)".
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   863
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   864
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   865
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   866
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
    (lastOldName withoutSeparators = lastNewName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   868
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   869
	    '  foo   ' -> 'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   870
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   871
	    '  bar   ' would be 'bar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   872
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   873
	^ oldName withoutSeparators.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   874
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   875
    (lastNewName startsWith:lastOldName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   876
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   877
	    'foo' -> 'fooX'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   878
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   879
	    'bar' would be 'barX'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   880
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   881
	suffix := lastNewName copyLast:(lastNewSize - lastOldSize).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   882
	^ (oldName , suffix).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   883
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   884
    (lastOldName startsWith:lastNewName) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   885
	"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   886
	    'fooX' -> 'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   887
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   888
	    'barX' would be 'bar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   889
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   890
	suffix := lastOldName copyLast:(lastOldSize - lastNewSize).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   891
	(oldName endsWith:suffix) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   892
	    ^ (oldName copyButLast:suffix size).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   893
	]
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   894
    ].
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   895
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   896
    prefix := lastOldName commonPrefixWith:lastNewName.
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   897
    suffix := lastOldName commonSuffixWith:lastNewName.
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
   898
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   899
    (prefix size > 0) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   900
	(suffix size > 0) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   901
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   902
	    prefix := prefix copyTo:(((lastNewName size - suffix size) min:(lastOldName size - suffix size)) min:prefix size).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   903
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   904
	    "last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   905
		'fooR' -> 'fooXR'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   906
	     then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   907
		'barR' would be 'barXR'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   908
	    "
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   909
	    left := lastOldName copyTo:prefix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   910
	    right := lastOldName copyLast:suffix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   911
	    lastNewSize > lastOldSize ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   912
		inserted := (lastNewName copyFrom:(left size + 1)) copyButLast:(right size).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   913
		inserted size > 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   914
		    (oldName startsWith:prefix) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   915
			^ oldName copyWithAll:inserted insertedAfterIndex:prefix size
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   916
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   917
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   918
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   919
	    (oldName string endsWith:suffix string) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   920
		deleted := (lastOldName string copyFrom:(prefix size + 1)) copyButLast:(suffix size).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   921
		(oldName size-suffix size-deleted size + 1) >= 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   922
		    ((oldName copyFrom:oldName size-suffix size-deleted size + 1) copyTo:deleted size) = deleted ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   923
			"last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   924
			    'fooXR' -> 'fooR'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   925
			 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   926
			    'barXS' would be 'barS'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   927
			"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   928
			^ (oldName copyTo:oldName size-suffix size-deleted size) , suffix
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   929
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   930
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   931
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   932
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   933
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   934
	(oldName endsWith:(lastOldName copyFrom:prefix size+1)) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   935
	    "last rename was
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   936
		'fooX' -> 'fooY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   937
	     then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   938
		'barX' would be 'barY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   939
	    "
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   940
	    left := oldName copyButLast:(lastOldName copyFrom:prefix size+1) size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   941
	    right := lastNewName copyFrom:prefix size+1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   942
	    ^ left , right
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   943
	]
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   944
    ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   945
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   946
    suffix size > 0 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   947
	|prefix2|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   948
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   949
	"last rename was:
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   950
	    'fooSUFF1' -> 'barSUFF1'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   951
	 then, a good default for
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   952
	    'fooSUFF2' -> 'barSUFF2'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   953
	"
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   954
	prefix := lastOldName copyTo:(lastOldName size - suffix size).  "/ the foo
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   955
	(oldName startsWith:prefix) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   956
	    prefix2 := lastNewName copyTo:(lastNewName size - suffix size). "/ the bar
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   957
	    ^ prefix2,(oldName copyFrom:(prefix size+1)).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   958
	].
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   959
    ].
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   960
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   961
    "/ was there something stripped at the end?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   962
    suffix := oldName commonSuffixWith:lastOldName.
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   963
    [suffix size > 0] whileTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   964
	tryAgain := self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   965
		    goodRenameDefaultFor:(oldName copyButLast:suffix size)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   966
		    lastOld:(lastOldName copyButLast:suffix size)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   967
		    lastNew:lastNewName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   968
	tryAgain notNil ifTrue:[^ tryAgain].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   969
	suffix := suffix copyFrom:2.
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   970
    ].
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   971
    ^ nil
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   972
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   973
    "
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   974
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fooXX'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   975
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'XXfoo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   976
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   977
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'foo'
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   978
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   979
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   980
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'fooYY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   981
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   982
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   983
     self goodRenameDefaultFor:'bar2' lastOld:'foo1' lastNew:'foo01'
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
   984
     self goodRenameDefaultFor:'barXY' lastOld:'fooXY' lastNew:'fooY'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   985
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   986
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXXXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   987
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'foXXXo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   988
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   989
     self goodRenameDefaultFor:'bar001' lastOld:'foo001' lastNew:'foo002_001'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   990
     self goodRenameDefaultFor:'CoastCore-CSFoo' lastOld:'CoastCore-CSBar' lastNew:'Coast-Core-CSBar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   991
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   992
     self goodRenameDefaultFor:'mti.odt2.level1HeadlineStyle'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   993
		       lastOld:'mti.odt2.level1HeadlineMatchPattern'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   994
		       lastNew:'Key_odt2_level1HeadlineMatchPattern'
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   995
    "
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   996
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   997
    "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
   998
!
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
   999
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1000
goodRenameDefaultForFile:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
  1001
    "generate a reasonable default for a file rename operation.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1002
     (Try to rename multiple files in the new fileBrowser,
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
  1003
     to see what this is doing)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
  1004
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1005
    |prefix suffix t
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1006
     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
  1007
     lastRemoved lastInserted default|
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1008
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1009
    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
  1010
    default notNil ifTrue:[ ^ default].
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1011
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1012
    lastOldWOSuffix := lastOldName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1013
    lastNewWOSuffix := lastNewName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1014
    oldWOSuffix := oldName asFilename nameWithoutSuffix.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1015
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1016
    "/ suffix change ?
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1017
    lastOldWOSuffix = lastNewWOSuffix ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1018
	lastOldName asFilename suffix ~= lastNewName asFilename suffix ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1019
	    ^ (oldName asFilename withSuffix:(lastNewName asFilename suffix)) pathName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1020
	].
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1021
    ].
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1022
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1023
    default := self goodRenameDefaultFor:oldWOSuffix lastOld:lastOldWOSuffix lastNew:lastNewWOSuffix.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1024
    default notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1025
	lastOldRest := lastOldName copyFrom:lastOldWOSuffix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1026
	lastNewRest := lastNewName copyFrom:lastNewWOSuffix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1027
	oldRest := oldName copyFrom:oldWOSuffix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1028
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1029
	^ default , lastNewRest
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1030
    ].
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1031
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1032
    prefix := lastOldWOSuffix commonPrefixWith:oldWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1033
    (lastNewWOSuffix startsWith:prefix) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1034
	lastOldRest := lastOldWOSuffix copyFrom:prefix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1035
	lastNewRest := lastNewWOSuffix copyFrom:prefix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1036
	oldRest := oldWOSuffix copyFrom:prefix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1037
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1038
	(lastNewRest endsWith:lastOldRest) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1039
	    t := lastNewRest copyButLast:lastOldRest size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1040
	    ^ ((prefix , t , oldRest) asFilename withSuffix:oldName asFilename suffix) name
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1041
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1042
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1043
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1044
    suffix := lastOldWOSuffix commonSuffixWith:lastNewWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1045
    suffix size > 0 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1046
	"/ last change changed something at the beginning
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1047
	prefix := oldWOSuffix commonPrefixWith:lastOldWOSuffix.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1048
	prefix size > 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1049
	    "/ this name starts with the same characters
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1050
	    lastRemoved := lastOldWOSuffix copyButLast:suffix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1051
	    lastInserted := lastNewWOSuffix copyButLast:suffix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1052
	    (lastRemoved startsWith:lastInserted) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1053
		oldWOSuffix size >= lastInserted size ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1054
		    ^ (oldWOSuffix copyTo:lastInserted size) , (oldName copyFrom:lastRemoved size + 1)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1055
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1056
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1057
	    ^ lastInserted , (oldName copyFrom:lastRemoved size + 1)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1058
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1059
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1060
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1061
    ^ nil
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1062
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1063
    "Modified: / 07-11-2006 / 13:58:39 / cg"
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1064
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1065
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1066
!DoWhatIMeanSupport class methodsFor:'typing distance'!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1067
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1068
isKey:k1 nextTo:k2
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1069
    "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
  1070
     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
  1071
     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
  1072
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1073
    ^ 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
  1074
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1075
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1076
     self isKey:$a nextTo:$a
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1077
     self isKey:$a nextTo:$s
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1078
     self isKey:$a nextTo:$q
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1079
     self isKey:$a nextTo:$w
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1080
     self isKey:$a nextTo:$z
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1081
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1082
    "
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1083
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1084
    "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
  1085
!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1086
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1087
isKey:k1 nextTo:k2 onKeyboard:keys
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1088
    "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
  1089
     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
  1090
     (typo checker uses a modified levenshtein, 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1091
      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
  1092
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1093
    |row1 row2 col1 col2|
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1094
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1095
    row1 := keys findFirst:[:eachRow | col1 := eachRow indexOf:k1. col1 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1096
    row1 == 0 ifTrue:[^ false].
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1097
    row2 := keys findFirst:[:eachRow | col2 := eachRow indexOf:k2. col2 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1098
    row2 == 0 ifTrue:[^ false].
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1099
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1100
    ^ (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
  1101
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1102
    "
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1103
     self isKey:$a nextTo:$q
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1104
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1105
    "
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1106
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1107
    "Modified (comment): / 01-05-2016 / 12:19:24 / cg"
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1108
!
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1109
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1110
keyboard
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1111
    "the keyboard layout
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1112
     (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
  1113
     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
  1114
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1115
    |lang|
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1116
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1117
    lang := UserPreferences current language.
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1118
    lang == #de ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1119
	^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1120
	       '1234567890-'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1121
	       '*qwertzuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1122
	       '**asdfghjkl:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1123
	       '***yxcvbnm'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1124
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1125
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1126
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1127
    lang == #fr ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1128
	^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1129
	       '1234567890'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1130
	       '*azertyuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1131
	       '**qsdfghjklm'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1132
	       '***wxcvbn,'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1133
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1134
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1135
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1136
    ^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1137
	   '1234567890-'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1138
	   '*qwertyuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1139
	   '**asdfghjkl:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1140
	   '***zxcvbnm'
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1141
    ).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1142
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1143
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1144
     self keyboard
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1145
    "
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1146
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1147
    "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
  1148
! !
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1149
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1150
!DoWhatIMeanSupport methodsFor:'code completion'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1151
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1152
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
  1153
    "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
  1154
     (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
  1155
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1156
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1157
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1158
        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
  1159
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1160
           (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
  1161
     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
  1162
     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
  1163
     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
  1164
     perform the completion.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1165
     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
  1166
     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
  1167
     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
  1168
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1169
     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
  1170
     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
  1171
     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
  1172
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1173
    | language |
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1174
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1175
    codeAspect := codeAspectArg.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1176
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1177
    languageOrNilArg notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1178
        language := languageOrNilArg
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1179
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1180
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1181
            | method |
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1182
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1183
            method := contextOrNilArg method.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1184
            method notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1185
                language := method programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1186
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1187
                contextOrNilArg isJavaContext ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1188
                    language := JavaLanguage instance
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1189
                ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1190
                    language := SmalltalkLanguage instance.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1191
                ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1192
            ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1193
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1194
            methodOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1195
                language := methodOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1196
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1197
                classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1198
                    language := classOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1199
                ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1200
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1201
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1202
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1203
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1204
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1205
        language isSmalltalk ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1206
            ^self codeCompletionForSmalltalkMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1207
        ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1208
        language isSTXJavaScript ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1209
            ^self codeCompletionForJavascriptMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1210
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1211
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1212
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1213
    "/ No completion support for given language
5051
6e150dbaf9bc #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 5050
diff changeset
  1214
    "/ 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
  1215
    self breakPoint: #jv.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1216
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1217
    "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
  1218
    "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
  1219
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1220
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1221
codeCompletionForLanguage: languageOrNil class: classOrNilArg context:contextOrNilArg codeView:codeViewArg
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1222
    "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
  1223
     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
  1224
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1225
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1226
     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
  1227
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1228
    | language |
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1229
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1230
    languageOrNil notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1231
        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
  1232
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1233
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1234
            language := contextOrNilArg method programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1235
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1236
            classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1237
                language := classOrNilArg programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1238
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1239
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1240
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1241
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1242
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1243
        language isSmalltalk ifTrue:[
4731
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1244
            classOrNil := classOrNilArg.
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1245
            contextOrNil := contextOrNilArg.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1246
            ^self codeCompletionForSmalltalkClass: classOrNil context: contextOrNil codeView: codeViewArg
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1247
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1248
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1249
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1250
    "/ 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
  1251
    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
  1252
    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
  1253
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1254
    "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
  1255
!
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1256
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1257
setClass: classOrNilArg andContext:contextOrNilArg
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1258
    classOrNil := classOrNilArg.
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1259
    contextOrNil := contextOrNilArg.
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1260
! !
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1261
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1262
!DoWhatIMeanSupport methodsFor:'code completion - JavaScript'!
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1263
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1264
codeCompletionForJavascriptMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1265
    "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
  1266
     (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
  1267
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1268
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1269
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1270
        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
  1271
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1272
           (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
  1273
     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
  1274
     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
  1275
     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
  1276
     perform the completion.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1277
     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
  1278
     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
  1279
     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
  1280
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1281
     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
  1282
     or nil, if called from the browser.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1283
     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
  1284
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1285
    languageOrNil := STXJavaScriptLanguage instance.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1286
    methodOrNil := methodOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1287
    classOrNil := classOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1288
    codeView := codeViewArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1289
    contextOrNil := contextOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1290
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1291
    JavaScriptCompletionEngine notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1292
        JavaScriptCompletionEngine new
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1293
           completeForMethod: methodOrNil class: classOrNil context: contextOrNil codeView: codeView into: actionBlock.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1294
    ].
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1295
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1296
    self information:'Not yet supported'.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1297
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1298
    "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
  1299
    "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
  1300
! !
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1301
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1302
!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
  1303
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1304
codeCompletionForSmalltalkClass: classOrNilArg context:contextOrNilArg codeView:codeViewArg
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1305
4379
f79671ee6211 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4378
diff changeset
  1306
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1307
     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
  1308
     nil, if called from the browser.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1309
     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
  1310
     This is not yet done, sigh"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1311
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1312
    |crsrPos char interval source node parent checkedNode instanceOrNilArg
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1313
     forceNewMessageSend classOfReceiver prevChar|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1314
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1315
    languageOrNil := SmalltalkLanguage instance.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1316
    classOrNil := classOrNilArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1317
    codeView := codeViewArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1318
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1319
    crsrPos := codeView characterPositionOfCursor"-1".
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1320
    char := codeView characterAtCharacterPosition:crsrPos.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1321
    "/ Transcript show:crsrPos; show:' '; showCR:char.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1322
    [crsrPos > 1 and:[char isSeparator or:['.' includes:char]]] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1323
        crsrPos := crsrPos - 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1324
        char := codeView characterAtCharacterPosition:crsrPos.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1325
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1326
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1327
    interval := codeView selectedInterval.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1328
    "/ Transcript show:'iv: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1329
    interval isEmpty ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1330
        interval := crsrPos"-1" to:crsrPos.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1331
        "/ Transcript show:'iv2: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1332
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1333
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1334
    source := codeView contentsAsString string.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1335
    source := source copyTo:crsrPos.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1336
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1337
    "/ this is too naive and stupid; if there is a syntactic error,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1338
    "/ 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
  1339
    "/ 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
  1340
    "/ without any progress.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1341
    "/ 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
  1342
    "/ as it parses the code. Stop, when the interval is hit.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1343
    "/ that will also work for syntactic incorrect source code.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1344
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1345
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1346
        "/ Transcript show:'nd1: '; showCR:node.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1347
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1348
    node isNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1349
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1350
        "/ Transcript show:'nd2 try: '; showCR:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1351
        node isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1352
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1353
            self breakPoint:#cg.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1354
            "/ self information:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1355
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1356
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1357
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1358
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1359
    forceNewMessageSend := false.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1360
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1361
    "/ 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
  1362
    prevChar := codeView characterBeforeCursor.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1363
    (prevChar isSeparator or:[ ')}]''' includes:prevChar ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1364
        (node isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1365
            and:[ (parent := node parent) notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1366
            and:[ parent isMessage ]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1367
        ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1368
            "/ completion after a variable node...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1369
            parent isKeyword ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1370
                "/ and it is a keyword message, we complete the keyword message instead
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1371
                node := parent.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1372
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1373
                "/ 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
  1374
                "/ (however, no character is available to determine what is useful)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1375
                forceNewMessageSend := true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1376
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1377
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1378
            (node isMessage and:[node isUnary]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1379
                "/ expanding <rcvr> foo |<- cursor here (i.e. a space after foo)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1380
                "/
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1381
                forceNewMessageSend := true.
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1382
"/                "/ can we see what we get from foo?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1383
"/                classOfReceiver := self
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1384
"/                                    classOfReceiver:node receiver
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1385
"/                                    inClass:classOrNil instance:instanceOrNil context:contextOrNil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1386
"/                classOfReceiver notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1387
"/                    |mthd|
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1388
"/
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1389
"/                    mthd := classOfReceiver lookupMethodFor:node selector.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1390
"/                    mthd notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1391
"/                        self halt.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1392
"/                        (ParseTreeSearcher isDefinitelyGetterMethod:mthd) ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1393
"/                            forceNewMessageSend := true.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1394
"/                        ]
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1395
"/                    ]
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1396
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1397
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1398
        ]
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1399
    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1400
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1401
    forceNewMessageSend ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1402
        "/ completion with nothing to start (right after a variable)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1403
        "/ 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
  1404
        classOfReceiver := self classOfNode:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1405
        classOfReceiver isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1406
            "/ 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
  1407
            "/ will be...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1408
            Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1409
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1410
            |superClass possible choice|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1411
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1412
            possible := classOfReceiver selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1413
            superClass := classOfReceiver superclass.
4938
bedac0cfaf04 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4936
diff changeset
  1414
            [superClass notNil "and:[(possible size + superClass selectors size) < 500]"] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1415
                possible := possible,superClass selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1416
                superClass := superClass superclass.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1417
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1418
            possible := possible copy sort.
4938
bedac0cfaf04 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4936
diff changeset
  1419
            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
  1420
            choice isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1421
                Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1422
                ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1423
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1424
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1425
            codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1426
                undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1427
                    codeView insertStringAtCursor:choice
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1428
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1429
                info:'Completion'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1430
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1431
        ^ self
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1432
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1433
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1434
    node isVariable ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1435
        self codeCompletionForVariable:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1436
        ^ self.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1437
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1438
    node isLiteral ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1439
        node value isSymbol ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1440
            self codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1441
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1442
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1443
        ^ self "/ huh - strings or what?
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1444
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1445
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1446
    checkedNode := node.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1447
    [checkedNode notNil] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1448
        checkedNode isMessage ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1449
            "/ completion in a message-send
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1450
            contextOrNilArg notNil ifTrue:[
4329
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1451
"/                |rcvrNode idx rcvr val|
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1452
"/
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1453
"/                (rcvrNode := checkedNode receiver) isVariable ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1454
"/                    rcvrNode isSelf ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1455
"/                        classOrNil := contextOrNil receiver class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1456
"/                    ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1457
"/                        (idx := contextOrNil argAndVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1458
"/                            val := contextOrNil argsAndVars at:idx.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1459
"/                            classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1460
"/                        ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1461
"/                            (idx := contextOrNil receiver class allInstVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1462
"/                                val := contextOrNil receiver instVarNamed:rcvrNode name.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1463
"/                                classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1464
"/                            ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1465
"/                        ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1466
"/                    ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1467
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1468
                instanceOrNilArg := contextOrNilArg receiver
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
            self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1471
                codeCompletionForMessage:checkedNode
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1472
                inClass:classOrNil instance:instanceOrNilArg
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1473
                context:contextOrNilArg codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1474
            ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1475
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1476
        checkedNode isMethod ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1477
            "/ completion in a method's selector pattern
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1478
            self codeCompletionForMethodSpec:checkedNode.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1479
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1480
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1481
        checkedNode := checkedNode parent.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1482
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1483
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1484
    self information:'Node is neither variable nor message.'.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1485
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1486
    "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
  1487
!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1488
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1489
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
  1490
    "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
  1491
     (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
  1492
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1493
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1494
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1495
        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
  1496
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1497
           (although not yet fully implemented, non-local rewrite procedures may and will be added in the future
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1498
     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
  1499
     or adding another keyword part after the cursor is possible.
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1500
     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
  1501
     to perform the completion.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1502
     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
  1503
     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
  1504
     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
  1505
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1506
     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
  1507
     or nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1508
     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
  1509
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1510
    |crsrPos char interval i source partialSource cursorLineSource
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1511
     suggestions actions title suggestionCollector|
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1512
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1513
    languageOrNil := SmalltalkLanguage instance.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1514
    methodOrNil := methodOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1515
    classOrNil := classOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1516
    codeView := codeViewArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1517
    contextOrNil := contextOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1518
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1519
"/    classOrNil isNil ifTrue:[
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1520
"/        self information:'No class'.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1521
"/        ^ self.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1522
"/    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1523
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1524
    crsrPos := codeView characterPositionOfCursor.
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  1525
    char := codeView characterAtCharacterPosition:(crsrPos-1 max:1).
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1526
    [crsrPos > 1 and:[char isSeparator "or:['.' includes:char]"]] whileTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1527
        crsrPos := crsrPos - 1.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1528
        char := codeView characterAtCharacterPosition:crsrPos.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1529
    ].
4711
1c2e635489e5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4710
diff changeset
  1530
    char == $. ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1531
        "/ either at end of statement or after a character constant
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1532
        crsrPos == 1 ifTrue:[^ self].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1533
        (codeView characterAtCharacterPosition:crsrPos-1) == $$ ifFalse:[^ self].
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1534
    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1535
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1536
    suggestionCollector :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1537
        [:listOfSuggestions :listOfActionsOrBlock :titleWhenAsking |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1538
            "/ may be called multiple times!!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1539
            suggestions isNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1540
                suggestions := listOfSuggestions.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1541
                actions := listOfActionsOrBlock.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1542
                title := titleWhenAsking.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1543
            ] ifFalse:[    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1544
                suggestions := suggestions asOrderedCollection.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1545
                actions isBlock ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1546
                    actions := Array new:suggestions size withAll:actions.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1547
                ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1548
                actions := actions asOrderedCollection.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1549
                
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1550
                suggestions addAll:listOfSuggestions.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1551
                listOfActionsOrBlock isBlock ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1552
                    actions addAll:(Array new:listOfSuggestions size withAll:listOfActionsOrBlock).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1553
                ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1554
                    actions addAll:listOfActionsOrBlock.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1555
                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1556
                title := titleWhenAsking.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1557
            ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1558
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1559
        
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1560
    interval := crsrPos-1 to:crsrPos.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1561
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1562
    source := codeView contentsAsString string.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1563
    partialSource := source copyTo:crsrPos.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1564
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1565
    methodOrNilArg isNil ifTrue:[
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1566
        (partialSource endsWith:Character cr) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1567
            partialSource := partialSource copyButLast.
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1568
        ].    
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1569
        "/ first try parsing the current cursor line.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1570
        "/ this helps doIts in a workspace, where additional garbage is often before the actual expression to be evaluated
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1571
        (i := partialSource lastIndexOf:Character cr) ~~ 0 ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1572
            "/ because cursorPositions and node-positions are required elsewhere to be correct,
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1573
            "/ I cannot just snip off the line and parse that one alone (later corrections will do so at wrong position).
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1574
            "/ Instead, create a copy of the whole source, with the stuff before the cursor line being blanked out.
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1575
            "/ However, because somewhere else, we fetch characters from the codeView using the index,
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1576
            "/ we must preserve the line structure (i.e. keep crs).
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1577
            cursorLineSource := partialSource copy.
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1578
            1 to:i do:[:pos | 
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1579
                (cursorLineSource at:pos) ~= Character cr ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1580
                    cursorLineSource at:pos put:Character space.
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1581
                ]
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1582
            ].    
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1583
            self
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1584
                tryCodeCompletionWithSource:cursorLineSource nodeInterval:interval
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1585
                at:crsrPos mustBeExpression:true
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1586
                into:suggestionCollector.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1587
        ].
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1588
    ].
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1589
    
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1590
"/    suggestions isEmptyOrNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1591
"/        "/ try parsing the partial source (from beginning up to the cursor)
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1592
"/        self
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1593
"/            tryCodeCompletionWithSource:partialSource nodeInterval:interval
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1594
"/            at:crsrPos mustBeExpression:(classOrNilArg isNil and:[methodOrNilArg isNil])
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1595
"/            into:suggestionCollector.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1596
"/    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1597
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1598
    suggestions isEmptyOrNil ifTrue:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1599
        "/ try parsing the whole source
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1600
        self
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1601
            tryCodeCompletionWithSource:source nodeInterval:interval
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1602
            at:crsrPos mustBeExpression:false
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1603
            into:suggestionCollector
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1604
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1605
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1606
    suggestions isNil ifTrue:[
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1607
        "/ try parsing the partial source (from beginning up to the cursor)
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1608
        self
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1609
            tryCodeCompletionWithSource:partialSource nodeInterval:interval
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1610
            at:crsrPos mustBeExpression:(classOrNilArg isNil and:[methodOrNilArg isNil])
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1611
            into:suggestionCollector.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1612
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1613
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1614
    suggestions isEmptyOrNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1615
        "/ nothing found
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1616
        ^ self
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1617
    ].    
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1618
    actionBlock value:suggestions value:actions value:title.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1619
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1620
    "Created: / 18-09-2013 / 15:25:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1621
! !
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1622
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1623
!DoWhatIMeanSupport methodsFor:'code completion - obsolete'!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1624
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1625
codeCompletionForClass:classOrNilArg context:contextOrNil codeView:codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1626
    <resource: #obsolete>
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1627
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1628
     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
  1629
     nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1630
     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
  1631
     This is not yet done, sigh"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1632
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1633
    ^self codeCompletionForLanguage: nil class:classOrNilArg context:contextOrNil codeView:codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1634
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1635
    "Modified: / 04-07-2006 / 18:48:26 / fm"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1636
    "Modified: / 28-08-2013 / 17:15:25 / cg"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1637
    "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
  1638
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1639
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1640
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
  1641
    <resource: #obsolete>
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1642
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1643
	codeCompletionForSmalltalkMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1644
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1645
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1646
!DoWhatIMeanSupport methodsFor:'code completion-helpers'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1647
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1648
askUserForCompletion:what for:codeView at:position from:allTheBest
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1649
    |list choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1650
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1651
    "/ cg: until the new stuff works,...
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1652
    ^ self old_askUserForCompletion:what for:codeView from:allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1653
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1654
"/    allTheBest isEmpty ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1655
"/        ^ nil
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1656
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1657
"/    allTheBest size == 1 ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1658
"/        ^ allTheBest first
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1659
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1660
"/    list := allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1661
"/    LastChoices notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1662
"/        lastChoice := LastChoices at:what ifAbsent:nil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1663
"/        lastChoice notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1664
"/            list := { lastChoice allBold } , (list copyWithout:lastChoice).
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1665
"/        ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1666
"/    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1667
"/    choice := Tools::CodeCompletionMenu
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1668
"/                openFor:codeView
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1669
"/                at:position
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1670
"/                with:allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1671
"/    LastChoices isNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1672
"/        LastChoices := Dictionary new.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1673
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1674
"/    LastChoices at:what put:choice.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1675
"/    ^ choice string
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1676
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1677
    "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
  1678
    "Modified: / 28-08-2013 / 16:41:35 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1679
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1680
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1681
askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1682
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1683
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1684
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1685
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1686
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1687
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1688
    LastChoices notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1689
	lastChoice := LastChoices at:what ifAbsent:nil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1690
	lastChoice notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1691
	    list := {lastChoice. nil. } , (list copyWithout:lastChoice).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1692
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1693
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1694
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1695
    list size < 30 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1696
	|menu idx exitKey|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1697
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1698
	menu := PopUpMenu labels:list.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1699
	menu hideOnKeyFilter:[:key | |hide|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1700
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1701
		hide ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1702
		    exitKey := key.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1703
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1704
		hide].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1705
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1706
	idx := menu startUp.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1707
	idx == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1708
	    exitKey notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1709
		codeView keyPress:exitKey x:0 y:0.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1710
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1711
	    ^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1712
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1713
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1714
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1715
	resources := codeView application isNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1716
			ifTrue:[ codeView resources]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1717
			ifFalse:[ codeView application resources ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1718
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1719
	choice := Dialog
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1720
	   choose:(resources string:'Choose ',what)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1721
	   fromList:list
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1722
	   lines:20
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1723
	   title:(resources string:'Code completion').
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1724
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1725
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1726
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1727
    LastChoices isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1728
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1729
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1730
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1731
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1732
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1733
    "Created: / 10-11-2006 / 14:00:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1734
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1735
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1736
codeCompletionForLiteralSymbol:nodeOrNil element:tokenOrNil considerAll:considerAll into:actionBlock
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1737
    "looking for all symbols is way too much and inprecise;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1738
     experiment: only present symbols which are used by the class,
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1739
     and classes in that class category, or at least: implemented as method.
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1740
     We'll see..."
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1741
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1742
    |sym possibleCompletions longest editAction start stop addSymbol
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1743
     parentSelector parent symbolSelectorClass|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1744
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  1745
    "/ Transcript show:'lit in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1746
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1747
    start := (nodeOrNil ? tokenOrNil) start.
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1748
    stop := (nodeOrNil ? tokenOrNil) stop.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1749
    (codeView characterAtCharacterPosition:stop) == $' ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1750
        ^ self.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1751
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1752
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1753
    sym := (nodeOrNil ? tokenOrNil) value.
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1754
    possibleCompletions := Set new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1755
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1756
    addSymbol :=
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1757
        [:aSymbol |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1758
            (aSymbol startsWith:sym) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1759
                (aSymbol = sym) ifFalse:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1760
                    possibleCompletions add:aSymbol
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1761
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1762
            ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1763
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1764
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1765
    (nodeOrNil notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1766
    and:[ (parent := nodeOrNil parent) notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1767
    and:[ parent isMessage ]]) ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1768
        parentSelector := parent selector.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1769
        ( #( perform: perform:ifNotUnderstood: ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1770
            symbolSelectorClass := self classOfNode:parent receiver.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1771
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1772
        ( #( #'onChangeSend:' ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1773
            "/ assume that send-target will be self.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1774
            (methodOrNil notNil and:[ methodOrNil selector notNil and:[ methodOrNil selector isUnarySelector ]]) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1775
                addSymbol value:(methodOrNil selector,'Changed').
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1776
            ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1777
            symbolSelectorClass := classOrNil.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1778
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1779
        ( #( #'onChangeSend:to:' ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1780
            symbolSelectorClass := self classOfNode:parent arguments second.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1781
        ].
5074
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1782
        
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1783
        "/ actually, I found that this gives good suggestions.
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1784
        symbolSelectorClass isNil ifTrue:[
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1785
            symbolSelectorClass := classOrNil.
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1786
        ].
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1787
        
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1788
        symbolSelectorClass notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1789
            symbolSelectorClass withAllSuperclassesDo:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1790
                cls ~~ Object ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1791
                    cls ~~ Model ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1792
                        cls methodDictionary keysDo:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1793
                    ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1794
                ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1795
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1796
        ].
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1797
    ].
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1798
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1799
    (considerAll or:[classOrNil isNil]) ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1800
        Smalltalk allClassesDo:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1801
            cls theNonMetaclass methodDictionary keys do:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1802
            cls theMetaclass methodDictionary keys do:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1803
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1804
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1805
        "/ Symbol allInstancesDo:addSymbol.
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1806
    ] ifFalse:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1807
        Smalltalk allClassesInCategory:classOrNil do:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1808
            cls theNonMetaclass instAndClassMethodsDo:[:mthd |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1809
                mthd usedSymbols do:addSymbol
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1810
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1811
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1812
    ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1813
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1814
    "/ add symbolic literals (especially for spec methods)
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1815
    classOrNil notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1816
        classOrNil theMetaclass instAndClassMethodsDo:[:mthd |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1817
            mthd literalsDo:[:lit |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1818
                lit isSymbol ifTrue:[ addSymbol value: lit ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1819
            ].    
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1820
        ].    
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1821
    ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1822
    
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1823
    possibleCompletions := possibleCompletions asOrderedCollection sort.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1824
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1825
    longest := possibleCompletions longestCommonPrefix.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1826
    possibleCompletions remove:longest ifAbsent:[].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1827
    possibleCompletions addFirst: longest.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1828
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1829
    editAction :=
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1830
        [:chosenIndex |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1831
            |chosen oldSym oldLen newLen|
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1832
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1833
            chosen := possibleCompletions at:chosenIndex.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1834
            chosen notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1835
                (codeView characterAtCharacterPosition:start) == $# ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1836
                    start := start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1837
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1838
                (codeView characterAtCharacterPosition:start) == $' ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1839
                    start := start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1840
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1841
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1842
                oldSym := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1843
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1844
                codeView
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1845
                    undoableDo:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1846
                        codeView replaceFromCharacterPosition:start to:stop with:chosen
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1847
                    ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1848
                    info:'Completion'.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1849
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1850
                (chosen startsWith:oldSym) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1851
                    oldLen := stop - start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1852
                    newLen := chosen size.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1853
                    codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1854
                    codeView dontReplaceSelectionOnInput
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1855
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1856
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1857
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1858
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1859
    actionBlock value:possibleCompletions value:editAction value:'symbol'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1860
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1861
    "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
  1862
    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1863
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1864
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1865
codeCompletionForMessage:node into:actionBlock
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1866
    "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
  1867
    
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1868
    |selector lcSelector bestSelectors parentSelector newParentSelector bestSelectors2 bestWithParenthesis allBest numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1869
     newParts nSelParts oldLen newLen selectorParts
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  1870
     findBest parentNode nodeReceiver "selectorsSentInCode" selectorsImplementedInClass
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  1871
     editAction parentNodeClassIfKnown
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1872
     receiverNodeClassIfKnown 
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1873
     offerParenthisationAroundNode parenthesisAroundIndex parentNodeToParenthesize
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1874
     offerValueInsertion valueToInsert valueToInsertIndex valueInfo
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1875
     classesFromAssignmentsToReceiver otherMessagesToReceiver
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1876
     canParenthesize|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1877
 
5039
8199b9455761 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5038
diff changeset
  1878
    "/ Transcript show:'node '; show:node; show:' ; '.
8199b9455761 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5038
diff changeset
  1879
    "/ Transcript show:'msg in '; show:methodOrNil; show:' / '; showCR:classOrNil.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1880
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1881
    offerParenthisationAroundNode := nil.
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1882
    offerValueInsertion := false.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1883
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1884
    "/ node at:1
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1885
 
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1886
    findBest := 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1887
        [:node :selector |
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1888
            |srchClasses bestSelectors bestPrefixes
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1889
             allMessagesSentToVariable classesImplementingAllMessages|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1890
 
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1891
            srchClasses := self classesOfNode:node.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1892
 
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1893
            srchClasses isEmptyOrNil ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1894
                node isVariable ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1895
                    allMessagesSentToVariable := Set new.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1896
                    rememberedNodes do:[:eachNode |
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1897
                        eachNode allMessageNodesDo:[:eachMessage |
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1898
                            |msgReceiver msgSelector|
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1899
                            
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1900
                            (msgReceiver := eachMessage receiver) isVariable ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1901
                                msgReceiver name = node name ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1902
                                    (msgSelector := eachMessage selector) ~= selector ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1903
                                        allMessagesSentToVariable add:msgSelector
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1904
                                    ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1905
                                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1906
                            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1907
                        ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1908
                    ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1909
                    allMessagesSentToVariable notEmpty ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1910
                        "/ consider classes which implement all those messages.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1911
                        classesImplementingAllMessages := Smalltalk allImplementorsOf:(allMessagesSentToVariable first).
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1912
                        allMessagesSentToVariable do:[:eachSelector |
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1913
                            classesImplementingAllMessages := classesImplementingAllMessages
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1914
                                                                select:[:cls | cls implements:eachSelector].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1915
                        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1916
                        srchClasses := classesImplementingAllMessages.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1917
                    ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1918
                ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1919
            ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1920
            bestSelectors := Set new.
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1921
            srchClasses isEmptyOrNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1922
                bestSelectors addAll:( Parser findBest:50 selectorsFor:selector in:nil forCompletion:true ).
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1923
            ] ifFalse:[    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1924
                srchClasses do:[:srchClass |
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1925
                    |bestForThisClass|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1926
 
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1927
                    bestForThisClass := Parser findBest:50 selectorsFor:selector in:srchClass forCompletion:true.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1928
                    bestForThisClass := self
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1929
                                        withoutSelectorsUnlikelyFor:srchClass
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1930
                                        from:bestForThisClass
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1931
                                        forPartial:selector.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1932
                    bestSelectors addAll:bestForThisClass.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  1933
                ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1934
            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1935
            "/ remove the already typed-in selector itself, in case.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1936
            bestSelectors remove:selector ifAbsent:[].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1937
            bestSelectors := bestSelectors asOrderedCollection.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1938
            bestSelectors
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1939
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1940
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1941
    selector := node selector.
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  1942
    lcSelector := selector asLowercase.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1943
    parentNode := node parent.
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  1944
    nodeReceiver := node receiver.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1945
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  1946
    "/ 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
  1947
    "/ do not attempt to complete the current message.
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  1948
    "/ If it is a message, we will look for parent-message completion also below (best2 stuff)
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1949
    (codeView characterBeforeCursor ? $ ) isSeparator ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1950
        selector isKeyword ifFalse:[
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  1951
            self codeCompletionForMessageTo:node into:actionBlock.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1952
            ^ self
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1953
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1954
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1955
 
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1956
    "/ only do this if the node-message has no parents around
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1957
    node parentheses isEmptyOrNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1958
        bestSelectors := findBest value:nodeReceiver value:selector.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1959
    ] ifFalse:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1960
        bestSelectors := OrderedCollection new.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  1961
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1962
 
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1963
    "/ if the receiver is a real variable,
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1964
    "/ 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
  1965
    "/ 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
  1966
    (tree notNil
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1967
        and:[ nodeReceiver isVariable
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1968
        and:[ nodeReceiver isSelf not
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1969
        and:[ nodeReceiver isSuper not ]]])
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  1970
    ifTrue:[
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  1971
        |receiverName possibleClasses possibleClassesFromOtherSends|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1972
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1973
        receiverName := nodeReceiver name.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1974
 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1975
        classesFromAssignmentsToReceiver := self classesFromAssignmentTo:receiverName in:tree.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1976
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1977
        possibleClasses := classesFromAssignmentsToReceiver.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1978
        possibleClasses isEmpty ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1979
            "/ messages sent
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1980
            otherMessagesToReceiver := self messagesSentTo:receiverName in:tree.
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  1981
            otherMessagesToReceiver remove:selector ifAbsent:[].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  1982
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1983
            otherMessagesToReceiver notEmpty ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1984
                "/ classes which respond to all
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1985
                possibleClassesFromOtherSends :=
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1986
                    Smalltalk 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1987
                        allClassesForWhich:[:cls |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1988
                            cls isLoaded
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1989
                            and:[ otherMessagesToReceiver
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1990
                                    conform:[:eachSelectorSent | cls canUnderstand:eachSelectorSent]]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1991
                        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1992
                possibleClasses := possibleClasses , possibleClassesFromOtherSends.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1993
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1994
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1995
 
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1996
        "/ if the receiver is a classVar/classInstVar,
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1997
        "/ include the class of its current value and UndefinedObject.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1998
        "/ This helps to complete class methods and (lazy) initializer code.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  1999
        (classOrNil notNil) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2000
            |tryValue currentValue|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2001
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2002
            tryValue := false.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2003
            (classOrNil theNonMetaclass allClassVarNames includes: receiverName) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2004
                tryValue := true.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2005
                currentValue := classOrNil theNonMetaclass classVarAt:receiverName.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2006
            ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2007
                (classOrNil isMeta and:[ classOrNil allInstVarNames includes: receiverName ]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2008
                    tryValue := true.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2009
                    currentValue := classOrNil theNonMetaclass instVarNamed:receiverName.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2010
                ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2011
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2012
            tryValue ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2013
                possibleClasses := { currentValue class } , possibleClasses.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2014
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2015
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2016
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2017
        (possibleClasses notEmpty and:[possibleClasses size < 15]) ifTrue:[
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2018
            bestSelectors :=
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2019
                (possibleClasses 
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2020
                    collectAll:[:eachClass |
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2021
                        Parser findBest:30 selectorsFor:selector in:eachClass forCompletion:true.
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2022
                    ] as:Set) asOrderedCollection.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2023
 
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2024
            "/ if any of those is a prefix-keyword of the selector,
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2025
            "/ 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
  2026
            bestSelectors := bestSelectors reject: [:sel | (selector startsWith: sel) or: [selector endsWith: sel]].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2027
        ].
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2028
    ].                                                                            
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2029
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2030
    "/ if we are behind a keyword messages colon,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2031
    "/ only look for matching prefix selectors;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2032
    "/ also, a good completion is to insert an argument;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2033
    "/ 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
  2034
    "/ Array new:1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2035
    selector isKeyword ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2036
        (node arguments size = selector numArgs) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2037
            offerParenthisationAroundNode := node. 
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2038
            "/ Transcript show:'2:'; showCR:node.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2039
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2040
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2041
        codeView characterBeforeCursor == $: ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2042
            (bestSelectors select:[:sel | sel asLowercase startsWith:lcSelector]) isEmpty ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2043
                "/ nothing better around
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2044
                |argIndex argNames argNameStrings impls|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2045
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2046
                argIndex := node selectorParts size.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2047
                argNames := Set new.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2048
                argNameStrings := OrderedCollection new.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2049
                impls := Smalltalk allImplementorsOf:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2050
                impls size < 10 ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2051
                    impls do:[:eachImplClass |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2052
                        |mthd argName|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2053
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2054
                        mthd := (eachImplClass compiledMethodAt:selector).
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2055
                        argName := (mthd methodArgNames ? #()) at:argIndex ifAbsent:nil.
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2056
                        argName notNil ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2057
                            (argNames includes:argName) ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2058
                                argNames add:argName.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2059
                                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
  2060
                            ].    
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2061
                        ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2062
                    ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2063
                    argNameStrings notEmptyOrNil ifTrue: [
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2064
                        argNameStrings := argNameStrings asOrderedCollection sort.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2065
                        actionBlock value:argNameStrings value:[:selIndex | ] value: 'argument name hint'.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2066
                        ^ self.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2067
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2068
                ]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2069
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2070
        ].
4369
810a78e62f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  2071
    ] ifFalse:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2072
        "/ 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
  2073
        "/ only consider longer keyword messages or unary messages.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2074
        "/ unless the node is parenthesized
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2075
        node hasParentheses ifFalse:[ 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2076
            (parentNode notNil and:[ parentNode isKeywordMessage ]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2077
                bestSelectors := bestSelectors select:[:sel | sel isUnarySelector or:[ sel startsWith:sel]]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2078
            ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2079
        ]
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2080
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2081
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2082
"/    bestSelectors := bestSelectors asOrderedCollection.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2083
"/    bestSelectors sort:[:a :b | a size < b size].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2084
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2085
    (selector isUnarySelector and:[ parentNode notNil and:[ parentNode isMessage ]]) ifTrue:[
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2086
        (parentSelector := parentNode selector) isKeyword ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2087
            "/ if its a unary message AND the parent is a keyword node, look for parent completion too.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2088
            "/ 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
  2089
            newParentSelector := parentSelector,selector.
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2090
            bestSelectors2 := findBest value:(parentNode receiver) value:newParentSelector.
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2091
            bestSelectors2 := bestSelectors2 select:[:sel | sel isKeyword and:[ sel startsWith:parentSelector]].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2092
            bestSelectors2 := bestSelectors2 asOrderedCollection sort:[:a :b | a size < b size].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2093
            bestSelectors := bestSelectors reject:[:sel | bestSelectors2 includes:sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2094
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2095
            "/ if the parent has a valid selector, offer parenthization
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2096
            (Smalltalk someImplementorOf:parentSelector) notNil ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2097
                offerParenthisationAroundNode := parentNode.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2098
                "/ Transcript show:'2:'; showCR:parentNode.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2099
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2100
        ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2101
            |kwSels|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2102
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2103
            "/ if its a unary message AND the parent is a unary or binary node, try again, sending the partial message
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2104
            "/ as a keyword to the parent node.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2105
            "/ this is the case when after "foo binOp bar if", which should include ifTrue: in the result.
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2106
            "/ transform from (the incorrectly parsed)
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2107
            "/    foo == (shift if)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2108
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2109
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2110
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2111
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2112
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2113
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2114
            "/           arg
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2115
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2116
            "/ into:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2117
            "/    (foo == shift) if
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2118
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2119
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2120
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2121
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2122
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2123
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2124
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2125
            "/           arg
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2126
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2127
            kwSels := findBest value:parentNode value:selector.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2128
            kwSels := kwSels select:[:sel | sel isKeyword].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2129
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2130
            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
  2131
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2132
            bestSelectors := bestSelectors reject:[:sel | kwSels includes:sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2133
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2134
            "/ these need to go to bestSelectors (see editAction)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2135
            parentNodeClassIfKnown := self classOfNode:parentNode.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2136
            (parentNodeClassIfKnown notNil and:[ parentNodeClassIfKnown includesBehavior: Boolean ]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2137
                "/ this is so common, that it deserves a special case:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2138
                "/ if we complete an if after some boolean message e.g '(a == b) if'
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2139
                "/ throw out the very unlikely ifNil, ifEmpty etc. messages (which are inherited by Object, but absolutely unrealistic)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2140
                bestSelectors := self
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2141
                                    withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2142
                                    from:bestSelectors
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2143
                                    forPartial:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2144
                kwSels := self
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2145
                            withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2146
                            from:kwSels
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2147
                            forPartial:selector.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2148
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2149
                "/ put keyword selectors in front, because they are very likely
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2150
                bestSelectors := kwSels , bestSelectors.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2151
            ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2152
                "/ put them at the end
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2153
                bestSelectors := bestSelectors , kwSels.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2154
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2155
        ]
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2156
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2157
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2158
    (selector isUnarySelector and:[ node isMessage ]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2159
        receiverNodeClassIfKnown := self classOfNode:nodeReceiver.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2160
        (receiverNodeClassIfKnown notNil and:[ receiverNodeClassIfKnown includesBehavior: Boolean ]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2161
            "/ this is so common, that it deserves a special case:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2162
            "/ if we complete an if after some boolean message e.g '(a == b) if'
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2163
            "/ throw out the very unlikely ifNil, ifEmpty etc. messages (which are inherited by Object, but absolutely unrealistic)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2164
            bestSelectors := self
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2165
                                withoutSelectorsUnlikelyFor:receiverNodeClassIfKnown
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2166
                                from:bestSelectors
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2167
                                forPartial:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2168
        ].
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  2169
    ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2170
    
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2171
    Verbose == true ifTrue:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2172
        Transcript show:'parentNode: '; showCR:parentNode.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2173
        Transcript show:'parentNode: '; showCR:parentNode class.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2174
        Transcript show:'sel: '; showCR:selector.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2175
    ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2176
    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2177
    canParenthesize := false.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2178
    parentNode notNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2179
        parentNode isMessage ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2180
            (((parentNode selector isUnarySelector not) and:[selector isUnarySelector])
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2181
            or:[ ((parentNode selector isKeyword) and:[selector isBinarySelector]) ]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2182
                canParenthesize := true.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2183
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2184
        ] ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2185
            offerParenthisationAroundNode isNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2186
                selector isKeyword ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2187
                    offerParenthisationAroundNode := node.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2188
                ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2189
            ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2190
        ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2191
    ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2192
    canParenthesize ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2193
        "/ 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
  2194
        "/ if, and, or or while.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2195
        "/ Here, offer a special completion which inserts parenthesis / brackets around the already
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2196
        "/ 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
  2197
        "/    expr wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2198
        "/ ->
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2199
        "/    [expr] whileXX:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2200
        true "((
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2201
            #( '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
  2202
        ) contains:[:part | part startsWith:selector])" ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2203
            (Smalltalk someImplementorOf:parentNode selector) notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2204
                |selsP selsB|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2205
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2206
                selsP := #( 'ifTrue:' 'ifFalse:' 'and' 'or' 'do' 'keysAndValuesDo' )
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2207
                            select:[:sel | sel startsWith:selector]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2208
                            thenCollect:[:sel | '(',parentNode selector,') ',sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2209
                ( #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' ) contains:[:sel | sel startsWith:selector]) 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2210
                ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2211
                    selsP := selsP copyWith:'(',parentNode selector,') ',selector  
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2212
                ]. 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2213
                selsB := #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' )
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2214
                            select:[:sel | sel startsWith:selector]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2215
                            thenCollect:[:sel | '[',parentNode selector,'] ',sel].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2216
                parentNodeToParenthesize := parentNode.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2217
                bestWithParenthesis := selsP , selsB.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2218
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2219
        ].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  2220
    ] ifFalse:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2221
        "/ also offer adding brackets for a while expression
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2222
        "/    expr wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2223
        "/ ->
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2224
        "/    [expr] whileXX:[]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2225
        ((
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2226
            #( 'whileTrue' 'whileFalse' 'ensure' 'on')
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2227
        ) contains:[:part | part startsWith:selector]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2228
            (node receiver isBlock) ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2229
                |sels|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2230
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2231
                (node receiver isMessage not
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2232
                or:[ (Smalltalk someImplementorOf:node receiver selector) notNil ]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2233
                    sels := #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' )
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2234
                                select:[:sel | sel startsWith:selector]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2235
                                thenCollect:[:sel | '[...] ',sel].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2236
                    parentNodeToParenthesize := node receiver.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2237
                    bestWithParenthesis := sels.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2238
                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2239
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2240
        ].
4416
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2241
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2242
 
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2243
    allBest := (bestSelectors ? #()) , (bestSelectors2 ? #()).
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2244
    self sortSelectors:allBest forSelector:selector lcSelector:lcSelector.
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2245
                        
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2246
    "/ sort: prefixes first.
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2247
    parentSelector notNil ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2248
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2249
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2250
                    by:[:sel | 
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  2251
                            (sel asLowercase startsWith:lcSelector) 
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2252
                            or:[sel startsWith:parentSelector]].
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2253
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2254
 
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2255
    "/ if receiver is super, always include the method's own selector
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  2256
    nodeReceiver isSuper ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2257
        (tree isMethod) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2258
            |mSel|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2259
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2260
            mSel := tree selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2261
            mSel notNil ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2262
                (mSel startsWith:selector) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2263
                    "/ already the word before the cursor?
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2264
                    (mSel ~= selector) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2265
                        allBest remove:mSel ifAbsent:[].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2266
                        allBest addFirst:mSel.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2267
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2268
                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2269
            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2270
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2271
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2272
 
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2273
    "/ another convenient hack; 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2274
    "/ if we have just typed in foo == 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2275
    "/ and the value of foo is a known literal,
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2276
    "/ offer inserting this literal. This is great in a debugger...
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2277
    ( #(#'==' #'=' #'~=' #'~~') includes:selector ) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2278
        |val|
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2279
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2280
        (val := self valueOfNode:nodeReceiver) notNil ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2281
            offerValueInsertion := true.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2282
            valueToInsert := val storeString.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2283
            nodeReceiver isVariable ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2284
                valueInfo := ' (current value of %1)' bindWith:nodeReceiver name.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2285
            ] ifFalse:[                
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2286
                valueInfo := ' (current value of expression)'.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2287
            ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2288
            valueInfo := valueInfo withColor:(Color grey).
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2289
        ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2290
    ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2291
    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2292
    (allBest isEmptyOrNil 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2293
        and:[bestWithParenthesis isEmptyOrNil
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2294
        and:[offerParenthisationAroundNode isNil
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2295
        and:[offerValueInsertion not]]] 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2296
    ) ifTrue:[ 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2297
        ^ self 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2298
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2299
 
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2300
"/    "/ 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
  2301
"/    "/ and also what is assigned to it.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2302
"/    nodeReceiver notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2303
"/        nodeReceiver isVariable ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2304
"/            rememberedNodes notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2305
"/                selectorsSentInCode := 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2306
"/                    (rememberedNodes
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2307
"/                        select:[:node | 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2308
"/                            node isMessage 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2309
"/                                and:[node receiver isVariable
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2310
"/                                and:[node receiver name = nodeReceiver name]]]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2311
"/                        thenCollect:[:node | 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2312
"/                            node selector]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2313
"/                    ) asSet.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2314
"/            ] ifFalse:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2315
"/                selectorsSentInCode := Set new. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2316
"/                tree allMessageNodesDo:[:msg |
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2317
"/                    (msg receiver isVariable
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2318
"/                        and:[msg receiver name = nodeReceiver name]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2319
"/                    ) ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2320
"/                        selectorsSentInCode add:msg selector
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2321
"/                    ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2322
"/                ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2323
"/                selectorsSentInCode remove:selector ifAbsent:[].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2324
"/            ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2325
"/        ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2326
"/    ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2327
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2328
    nodeReceiver notNil ifTrue:[
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2329
        |classOrNil|
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2330
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2331
        classOrNil := self classOfNode:nodeReceiver.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2332
        classOrNil isNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2333
            classesFromAssignmentsToReceiver size == 1 ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2334
                classOrNil := classesFromAssignmentsToReceiver anElement
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2335
            ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2336
        ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2337
        classOrNil notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2338
            selectorsImplementedInClass := classOrNil selectors.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2339
"/            selectorsImplementedInClass := Set new.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2340
"/            classOrNil withAllSuperclassesDo:[:cls |
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2341
"/                cls theNonMetaclass ~~ Object ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2342
"/                    selectorsImplementedInClass addAll:cls selectors.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2343
"/                ]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2344
"/            ]    
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2345
        ]
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  2346
    ].    
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2347
    selectorsImplementedInClass notNil ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2348
        "/ 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
  2349
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2350
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2351
                    by:[:sel | selectorsImplementedInClass includes:sel].
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2352
    ].
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2353
    otherMessagesToReceiver "selectorsSentInCode" notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2354
        "/ 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
  2355
        "/ 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
  2356
        "/ selectors sent previously. sigh.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2357
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2358
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2359
                    by:[:sel | otherMessagesToReceiver "selectorsSentInCode" includes:sel].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2360
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2361
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2362
"/ this makes it very slow
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2363
"/false ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2364
"/    srchClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2365
"/        implClass := srchClass whichClassIncludesSelector:best.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2366
"/    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2367
"/        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
  2368
"/        implClass size == 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2369
"/            implClass := implClass first.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2370
"/        ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2371
"/            implClass := nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2372
"/        ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2373
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2374
"/
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2375
"/    info := best storeString.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2376
"/    implClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2377
"/        info := implClass name , ' >> ' , info.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2378
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2379
"/    self information:info.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2380
"/].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2381
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2382
    "/ the one's 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
  2383
    allBest := self splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2384
                    by:[:sel | sel notNil and:[sel asLowercase startsWith:lcSelector]].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2385
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2386
    "/ heuristic hack:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2387
    "/ '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
  2388
    "/ we know, that those are most often wanted!!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2389
    selector size <= 2 ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2390
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2391
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2392
                    by:[:sel | 
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2393
                        #(ifTrue: ifFalse: isNil notNil whileTrue whileFalse) includes:sel
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2394
                    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2395
    ]. 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2396
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2397
    self sortUsefulSelectorsIn:allBest. "/cosmetics
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2398
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2399
    "/ parenthesizers always at the end.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2400
    bestWithParenthesis notEmptyOrNil ifTrue:[ 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2401
        allBest := allBest , bestWithParenthesis.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2402
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2403
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2404
    "/ self at:1 put:#foo
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2405
    "/ Array new:10
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2406
    offerParenthisationAroundNode notNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2407
        allBest := allBest copyWith:( '(',selector,')' ).
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2408
        parenthesisAroundIndex := allBest size.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2409
    ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2410
    offerValueInsertion ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2411
        allBest := allBest copyWith:( '... ',(valueToInsert contractTo:30),valueInfo). 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2412
        valueToInsertIndex := allBest size.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2413
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2414
 
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2415
    editAction :=
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2416
        [:index |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2417
            |crsrPos chosen parenthesisToInsert action|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2418
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2419
            action := nil.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2420
            crsrPos := codeView characterPositionOfCursor.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2421
            chosen := allBest at:index.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2422
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2423
            chosen ~= selector ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2424
                (bestWithParenthesis notNil and:[bestWithParenthesis includes:chosen]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2425
                    "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2426
                    "/   chosen at: 10 if
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2427
                    "/ put parenthesis around, and add ifTrue/ifFalse
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2428
                    "/ i.e.:   (chosen at:10) ifTrue:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2429
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2430
                    "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2431
                    "/   a > 10 wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2432
                    "/ put brackets around and add whileTrue/whileFalse
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2433
                    "/ i.e.:   [a > 10] whileTrue:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2434
                    parenthesisToInsert := chosen first == $( ifTrue:'()' ifFalse:'[]'.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2435
                    chosen := (chosen copyFrom:(chosen lastIndexOf:parenthesisToInsert second)+1) withoutSeparators.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2436
                ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2437
                    (offerParenthisationAroundNode notNil and:[index = parenthesisAroundIndex]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2438
                        "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2439
                        "/      Array new:10
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2440
                        "/ put parenthesis around.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2441
                        "/ i.e.:   (Array new:10)
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2442
                        action :=
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2443
                            [
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2444
                                codeView insertString:'(' atCharacterPosition:offerParenthisationAroundNode start.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2445
                                codeView insertString:')' atCharacterPosition:offerParenthisationAroundNode stop+2.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2446
                                codeView cursorToCharacterPosition:(offerParenthisationAroundNode stop+2); cursorRight.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2447
                            ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2448
                    ] ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2449
                        (offerValueInsertion and:[index = valueToInsertIndex]) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2450
                            "/ for input like: 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2451
                            "/      foo == 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2452
                            "/ insert a value
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2453
                            "/ i.e.:   foo == #someSymbol
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2454
                            action :=
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2455
                                [
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2456
                                    codeView characterBeforeCursor isSeparator ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2457
                                        codeView insertStringAtCursor:' '.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2458
                                    ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2459
                                    codeView insertStringAtCursor:valueToInsert.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2460
                                    "/ codeView cursorRight.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2461
                                ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2462
                        ]
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2463
                    ].    
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2464
                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2465
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2466
                action isNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2467
                    numArgs := chosen numArgs.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2468
                    (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:chosen]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2469
                        selectorParts := parentNode selectorParts , node selectorParts.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2470
                    ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2471
                        selectorParts := node selectorParts.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2472
                    ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2473
                    nSelParts := selectorParts size.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2474
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2475
                    newParts := chosen asCollectionOfSubstringsSeparatedBy:$:.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2476
                    newParts := newParts select:[:part | part size > 0].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2477
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2478
                    action :=
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2479
                        [
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2480
                            |positionOfFirstArg newCursorPosition stop checkForArgumentTemplates
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2481
                             newPart oldPartialToken start|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2482
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2483
                            checkForArgumentTemplates := (selector isUnarySelector and:[chosen isKeywordSelector]).
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2484
                            numArgs > nSelParts ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2485
                                "/ new selector has more arguments; append them
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2486
                                stop := selectorParts last stop.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2487
                                codeView deleteFromCharacterPosition:stop+1 to:crsrPos-1.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2488
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2489
                                "/ append the rest ...
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2490
                                (numArgs min:newParts size) downTo:(nSelParts+1) do:[:idx |
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2491
                                    |newPart|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2492
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2493
                                    newPart := newParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2494
                                    newPart := newPart , ':'.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2495
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2496
                                    (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2497
                                        newPart := ':' , newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2498
                                    ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2499
                                    newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2500
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2501
                                    codeView replaceFromCharacterPosition:stop to:stop with:newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2502
                                    "/ remember the leftMost replacement's end as new cursor position
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2503
                                    newCursorPosition := stop + newPart size
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2504
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2505
                                checkForArgumentTemplates := true.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2506
                            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2507
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2508
                            "/ replace existing parts
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2509
                            (nSelParts min:newParts size) downTo:1 do:[:idx |
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2510
                                |skipColon|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2511
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2512
                                skipColon := 0.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2513
                                newPart := newParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2514
                                oldPartialToken := selectorParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2515
                                start := oldPartialToken start.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2516
                                stop := oldPartialToken stop.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2517
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2518
                                (chosen endsWith:$:) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2519
                                    (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2520
                                        newPart := newPart , ':'.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2521
                                    ] ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2522
                                        skipColon := 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2523
                                    ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2524
                                ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2525
                                    (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2526
                                        newPart := newPart , ':'
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2527
                                    ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2528
                                        |nextChar|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2529
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2530
                                        nextChar := codeView characterAtCharacterPosition:stop+1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2531
                                        nextChar isSeparator ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2532
                                            nextChar == $. ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2533
                                                newPart := newPart , ' '
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2534
                                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2535
                                        ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2536
                                    ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2537
            "/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2538
            "/                        ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2539
            "/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2540
                                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2541
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2542
                                oldPartialToken value ~= newPart ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2543
                                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2544
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2545
                                    oldLen := stop - start + 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2546
                                    newLen := newPart size.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2547
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2548
                                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2549
                                    "/ remember the leftMost replacement's end as new cursor position
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2550
                                    newCursorPosition := start + newPart size + skipColon. "/ (newLen-oldLen) + 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2551
                                    "/ codeView cursorToCharacterPosition:newCursorPosition.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2552
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2553
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2554
                            newCursorPosition notNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2555
                                codeView cursorToCharacterPosition:newCursorPosition-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2556
                                codeView cursorRight.  "/ avoid going to the next line !!
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2557
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2558
                            codeView dontReplaceSelectionOnInput.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2559
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2560
                            checkForArgumentTemplates ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2561
                                "/ add opening brackets, etc.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2562
                                self insertAdditonalStuffAfterSelector:chosen.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2563
                            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2564
                            parenthesisToInsert notNil ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2565
                                |sav pos|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2566
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2567
                                sav := codeView characterPositionOfCursor-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2568
                                "/ check if already parenthized
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2569
                                parentNodeToParenthesize hasParentheses ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2570
                                    pos := parentNodeToParenthesize parentheses first first.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2571
                                    codeView selectFromCharacterPosition:pos to:pos.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2572
                                    codeView replaceSelectionBy:(parenthesisToInsert copyFirst:1) asString.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2573
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2574
                                    pos := parentNodeToParenthesize parentheses first last.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2575
                                    codeView selectFromCharacterPosition:pos to:pos.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2576
                                    codeView replaceSelectionBy:(parenthesisToInsert copyLast:1) asString.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2577
                                    codeView cursorToCharacterPosition:sav; cursorRight
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2578
                                ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2579
                                    codeView insertString:(parenthesisToInsert copyLast:1) atCharacterPosition:node receiver stop+1.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2580
                                    codeView insertString:(parenthesisToInsert copyFirst:1) atCharacterPosition:parentNodeToParenthesize start.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2581
                                    codeView cursorToCharacterPosition:sav+2; cursorRight
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2582
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2583
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2584
                        ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2585
                    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2586
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2587
                codeView
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2588
                    undoableDo:action
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2589
                    info:'Completion'.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2590
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2591
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2592
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2593
    actionBlock value:allBest value:editAction value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2594
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2595
    "Created: / 10-11-2006 / 13:18:27 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2596
    "Modified: / 16-02-2010 / 10:33:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2597
    "Modified: / 01-05-2016 / 18:36:36 / cg"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2598
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2599
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2600
codeCompletionForMessageTo:node into:actionBlock
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2601
    "find good suggestions for a message send to node, with no input yet"
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2602
    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2603
    |knownClass suggestions selectorsImplementedInClass mostUseful editActions pos|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2604
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2605
    (knownClass := self classOfNode:node) isNil ifTrue:[^ self].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2606
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2607
    selectorsImplementedInClass := Set new.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2608
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2609
    knownClass withAllSuperclassesDo:[:cls |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2610
        cls ~~ Object ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2611
            selectorsImplementedInClass addAll:cls selectors.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2612
        ]    
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2613
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2614
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2615
    knownClass isMeta ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2616
        selectorsImplementedInClass := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2617
            selectorsImplementedInClass reject:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2618
                |mthd|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2619
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2620
                mthd := knownClass lookupMethodFor:sel.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2621
                mthd notNil and:[mthd category startsWith: 'documentation']
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2622
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2623
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2624
        knownClass theNonMetaclass isAbstract ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2625
            mostUseful := selectorsImplementedInClass select:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2626
                            knownClass implements:sel
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2627
                          ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2628
        ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2629
            mostUseful := selectorsImplementedInClass select:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2630
                                |mthd|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2631
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2632
                                mthd := knownClass lookupMethodFor:sel.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2633
                                mthd notNil and:[mthd category startsWith: 'instance']
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2634
                          ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2635
        ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2636
    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2637
        mostUseful := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2638
            #(
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2639
                "/ blocks
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2640
                ifTrue: ifFalse: whileTrue: whileFalse: on:do: ensure: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2641
                whileTrue whileFalse loop
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2642
                "/ any
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2643
                isNil notNil isEmpty notEmpty 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2644
            ).
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2645
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2646
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2647
    mostUseful notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2648
        suggestions := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2649
            (selectorsImplementedInClass select:[:sel | mostUseful includes:sel]) asNewOrderedCollection sort
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2650
            ,
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2651
            (selectorsImplementedInClass reject:[:sel | mostUseful includes:sel]) asNewOrderedCollection sort.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2652
    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2653
        suggestions := selectorsImplementedInClass asNewOrderedCollection sort.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2654
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2655
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2656
    suggestions := suggestions reject:[:sel | sel first == $_].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2657
    self sortUsefulSelectorsIn:suggestions. "/cosmetics
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2658
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2659
    pos := codeView characterPositionOfCursor.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2660
    editActions := suggestions collect:[:word |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2661
                        self editActionToReplaceCodeFrom:pos to:pos-1 by:word.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2662
                   ].                
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2663
    actionBlock value:suggestions value:editActions value:nil.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2664
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2665
    "Created: / 01-05-2016 / 17:01:21 / cg"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2666
    "Modified: / 01-05-2016 / 18:54:03 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2667
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2668
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2669
codeCompletionForMethodSpec:node
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2670
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2671
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2672
    self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2673
	codeCompletionForMethodSpec:node
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2674
	into:
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2675
	    [:suggestions :action :whatIsIt |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2676
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2677
	    |chosen|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2678
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2679
	    chosen := self askUserForCompletion:whatIsIt for:codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2680
			   at:node start from:suggestions.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2681
	    chosen notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2682
		action value:(suggestions indexOf:chosen)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2683
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2684
	].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2685
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2686
"/    |crsrPos
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2687
"/     selectorSoFar matchingSelectors
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2688
"/     selectors distances best rest
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2689
"/     allExistingMethods nameBag namesByCount selectors1 selectors2|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2690
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2691
"/    crsrPos := codeView characterPositionOfCursor - 1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2692
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2693
"/    selectorSoFar := ''.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2694
"/    node selectorParts doWithIndex:[:partToken :argNr|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2695
"/        |part|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2696
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2697
"/        part := partToken value.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2698
"/        selectorSoFar := selectorSoFar , part.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2699
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2700
"/        (crsrPos >= partToken start
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2701
"/        and:[crsrPos <= partToken stop]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2702
"/            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2703
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2704
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2705
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2706
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2707
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2708
"/                                        md := eachClass theMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2709
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2710
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2711
"/                                    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2712
"/                "/ dont forget the stuff in the class-line
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2713
"/                Metaclass withAllSuperclassesDo:[:cls |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2714
"/                    matchingSelectors addAll:(cls methodDictionary keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2715
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2716
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2717
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2718
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2719
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2720
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2721
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2722
"/                                        md := eachClass theNonMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2723
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2724
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2725
"/                                    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2726
"/            ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2727
"/            selectors := matchingSelectors asOrderedCollection.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2728
"/
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2729
"/            "/ 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
  2730
"/            (selectors size == 1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2731
"/            and:[selectors first = selectorSoFar]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2732
"/                selectorSoFar numArgs == 0 ifTrue:[ ^ self ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2733
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2734
"/                allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2735
"/                                        collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2736
"/                nameBag := Bag new.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2737
"/                allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2738
"/                namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2739
"/                "/ take the one which occurs most often
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2740
"/                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
  2741
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2742
"/                codeView
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2743
"/                    undoableDo:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2744
"/                        (crsrPos+1) >= codeView contents size ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2745
"/                            codeView paste:best.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2746
"/                        ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2747
"/                            codeView insertString:best atCharacterPosition:crsrPos+1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2748
"/                        ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2749
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2750
"/                    info:'completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2751
"/                codeView cursorToCharacterPosition:(crsrPos + best size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2752
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2753
"/                "the ones implemented in superclasses are shown first"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2754
"/                classOrNil notNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2755
"/                    selectors1 := selectors select:[:sel | classOrNil respondsTo:sel].  "/ in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2756
"/                    selectors2 := selectors reject:[:sel | selectors1 includes:sel ].   "/ not in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2757
"/                ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2758
"/                    selectors1 := selectors
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2759
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2760
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2761
"/                distances := selectors1 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2762
"/                distances sortWith:selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2763
"/                selectors1 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2764
"/                selectors := selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2765
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2766
"/                selectors2 notEmptyOrNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2767
"/                    distances := selectors2 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2768
"/                    distances sortWith:selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2769
"/                    selectors2 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2770
"/                    selectors1 := selectors1 collect:[:sel | sel allBold].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2771
"/                    selectors := selectors1,selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2772
"/                ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2773
"/
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2774
"/                best := self askUserForCompletion:'selector' for:codeView at:(node start) from:selectors.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2775
"/                best isNil ifTrue:[^ self].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2776
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2777
"/                rest := best copyFrom:selectorSoFar size.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2778
"/                codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2779
"/                    undoableDo:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2780
"/                        codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2781
"/                            replaceFromCharacterPosition:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2782
"/                            to:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2783
"/                            with:rest
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2784
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2785
"/                    info:'Completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2786
"/                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2787
"/            ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2788
"/            codeView cursorRight. "/ kludge to make it visible
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2789
"/        ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2790
"/    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2791
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2792
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2793
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2794
    "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
  2795
    "Modified: / 01-06-2012 / 20:31:36 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2796
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2797
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2798
codeCompletionForMethodSpec:node into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2799
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2800
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2801
    |crsrPos crsrLine crsrCol
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2802
     selectorSoFar matchingSelectors
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2803
     selectors distances
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2804
     allExistingMethods nameBag namesByCount 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2805
     allSelectors
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2806
     selectorsForIsXXXTests selectorsSentInClass selectorsImplementedInSuper 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2807
     editAction editActionForArg argNames selectorsForVars
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2808
     selectorTypedSoFar addIfNotYetImplemented alreadyOK|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2809
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2810
    allSelectors := Set new.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2811
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2812
    "/ Transcript showCR:'m'.
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2813
    crsrLine := codeView cursorLine.
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2814
    crsrCol := codeView cursorCol.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2815
    crsrPos := codeView characterPositionOfCursor - 1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2816
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2817
    selectorTypedSoFar := node selector.
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2818
    selectorTypedSoFar isUnarySelector ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2819
        "/ user has just begun to edit a selector.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2820
        "/ 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
  2821
        classOrNil notNil ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2822
            selectorsForVars := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2823
            selectorsImplementedInSuper := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2824
            selectorsSentInClass := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2825
            selectorsForIsXXXTests := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2826
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2827
            addIfNotYetImplemented :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2828
                [:list :sel |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2829
                    sel ~= selectorTypedSoFar ifTrue:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2830
                        (allSelectors includes:sel) ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2831
                            (classOrNil implements:sel asSymbol) ifFalse:[ 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2832
                                selectorsForVars add:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2833
                                allSelectors add:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2834
                            ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2835
                        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2836
                    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2837
                ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2838
                
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2839
            classOrNil instVarNames do:[:nm |
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2840
                (nm startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2841
                    addIfNotYetImplemented value:selectorsForVars value:nm.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2842
                    addIfNotYetImplemented value:selectorsForVars value:(nm,':').
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2843
                 ]
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2844
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2845
            classOrNil isMeta ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2846
                classOrNil theNonMetaclass classVarNames do:[:nm |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2847
                    |nmSel|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2848
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2849
                    nmSel := nm asLowercaseFirst.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2850
                    (nmSel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2851
                        addIfNotYetImplemented value:selectorsForVars value:nmSel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2852
                        addIfNotYetImplemented value:selectorsForVars value:(nmSel,':').
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2853
                    ]
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2854
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2855
            ] ifFalse:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2856
                "/ isXXX ?
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2857
                (('is',classOrNil nameWithoutPrefix) startsWith:selectorTypedSoFar ) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2858
                    addIfNotYetImplemented value:selectorsForIsXXXTests value:('is',classOrNil nameWithoutPrefix).
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2859
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2860
            ].
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2861
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2862
            "/ and also messages sent by the class itself
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2863
            classOrNil methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2864
                m messagesSentToSelf do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2865
                    (sel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2866
                        addIfNotYetImplemented value:selectorsSentInClass value:sel.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2867
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2868
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2869
            ].
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2870
            classOrNil isMeta ifFalse:[
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2871
                classOrNil theMetaclass methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2872
                    m messagesSent do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2873
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2874
                            addIfNotYetImplemented value:selectorsSentInClass value:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2875
                        ]                     
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2876
                    ]                     
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2877
                ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2878
            ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2879
            "/ and also messages implemented by superclasses (except Object)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2880
            classOrNil allSuperclassesDo:[:eachSuperclass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2881
                eachSuperclass ~~ Object ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2882
                    eachSuperclass methodDictionary keysDo:[:sel |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2883
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2884
                            addIfNotYetImplemented value:selectorsImplementedInSuper value:sel.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2885
                        ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2886
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2887
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2888
            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2889
        ].
4371
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  2890
    ].
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  2891
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2892
    selectorSoFar := ''.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2893
    matchingSelectors := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2894
    
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2895
    node selectorParts doWithIndex:[:partToken :argNr|
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2896
        |part|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2897
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2898
        part := partToken value.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2899
        selectorSoFar := selectorSoFar , part.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2900
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2901
        (crsrPos >= partToken start 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2902
            and:[crsrPos <= partToken stop
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2903
                 or:[ (crsrPos == (partToken stop+1))
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2904
                      and:[codeView characterBeforeCursor == Character space]] ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2905
        ) ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2906
            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2907
                Smalltalk 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2908
                    allClassesDo:[:eachClass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2909
                        |md|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2910
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2911
                        md := eachClass theMetaclass methodDictionary.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2912
                        matchingSelectors addAll:(md keys 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2913
                                                    select:[:sel |sel startsWith:selectorSoFar]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2914
                    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2915
                "/ do not forget the stuff in the class-line
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2916
                Metaclass withAllSuperclassesDo:[:cls |
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2917
                    matchingSelectors addAll:(cls methodDictionary keys 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2918
                                                select:[:sel |sel startsWith:selectorSoFar]).
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2919
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2920
            ] ifFalse:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2921
                Smalltalk 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2922
                    allClassesDo:[:eachClass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2923
                        |md|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2924
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2925
                        md := eachClass theNonMetaclass methodDictionary.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2926
                        matchingSelectors addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2927
                    ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2928
            ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2929
        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2930
    ].  
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2931
    alreadyOK := matchingSelectors includes:selectorTypedSoFar.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2932
    matchingSelectors remove:selectorTypedSoFar ifAbsent:[].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2933
    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2934
    selectors := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2935
    selectors addAll:matchingSelectors.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2936
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2937
    selectorsForVars notNil ifTrue:[ selectors addAll:selectorsForVars ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2938
    selectorsSentInClass notNil ifTrue:[ selectors addAll:selectorsSentInClass ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2939
    selectorsImplementedInSuper notNil ifTrue:[ selectors addAll:selectorsImplementedInSuper ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2940
    selectorsForIsXXXTests notNil ifTrue:[ selectors addAll:selectorsForIsXXXTests ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2941
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2942
    selectors := selectors asOrderedCollection.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2943
    selectors sort:[:a :b | a size < b size].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2944
    selectorsForVars notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2945
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2946
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2947
                        by:[:sel | selectorsForVars includes:sel].
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
    selectorsSentInClass notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2950
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2951
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2952
                        by:[:sel | selectorsSentInClass includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2953
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2954
    selectorsImplementedInSuper notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2955
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2956
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2957
                        by:[:sel | selectorsImplementedInSuper includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2958
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2959
    selectorsForIsXXXTests notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2960
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2961
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2962
                        by:[:sel | selectorsForIsXXXTests includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2963
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2964
    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2965
    selectors size > 100 ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2966
        selectors := selectors copyTo:100.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2967
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2968
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2969
    "/ 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
  2970
    "/ he might want to complete the argument-name
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2971
    (alreadyOK and:[selectorSoFar numArgs > 0]) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2972
        allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2973
                                    collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2974
        nameBag := Bag new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2975
        allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2976
        namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2977
        namesByCount := namesByCount copyToMax:5.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2978
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2979
        "/ take the one which occurs most often
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2980
        argNames := (namesByCount collect:[:a | a key]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2981
        argNames do:[:eachArgName |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2982
            selectors add:('%1 %2 %3' 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2983
                            bindWith:(selectorSoFar colorizeAllWith:Color darkGrey) 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2984
                            with:eachArgName
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2985
                            with:('(argument)' allItalic colorizeAllWith:Color darkGrey)).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2986
        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2987
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2988
        editActionForArg :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2989
                [:chosenItem |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2990
                    |chosenName|
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
                    chosenName := chosenItem 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2993
                                    copyFrom:(selectorSoFar size+2)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2994
                                    to:(chosenItem indexOfSeparatorStartingAt:selectorSoFar size+2)-1.
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2995
                    codeView
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2996
                        undoableDo:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2997
                            (crsrPos+1) >= codeView contents size ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2998
                                codeView paste:chosenName.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2999
                                codeView cursorToCharacterPosition:(crsrPos + chosenName size - 1).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3000
                            ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3001
                                codeView cursorToCharacterPosition:crsrPos.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3002
                                codeView cursorRight.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3003
                                codeView insertStringAtCursor:chosenName.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3004
                                codeView selectFromCharacterPosition:crsrPos+1 to:crsrPos+1+chosenName size-1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3005
                                codeView dontReplaceSelectionOnInput
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3006
                            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3007
                        ]
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3008
                        info:'argname completion'.
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3009
                ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3010
    ].            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3011
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3012
    "/ no, still more possibilities for the selector.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3013
    "/ the ones implemented in superclasses are shown first.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3014
    classOrNil notNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3015
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3016
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3017
                        by:[:sel | classOrNil superclass implements:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3018
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3019
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3020
"/"/    distances := selectors collect:[:each | each spellAgainst:selectorSoFar].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3021
"/"/    distances sortWith:selectors.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3022
"/"/    selectors reverse.
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
    editAction :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3025
        [:selectedCompletionIndex |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3026
            |chosen rest|
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
            chosen := selectors at:selectedCompletionIndex.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3029
            (editActionForArg notNil and:[ chosen includesSeparator ]) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3030
                editActionForArg value:chosen.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3031
            ] ifFalse:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3032
                rest := chosen copyFrom:selectorSoFar size + 1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3033
                codeView
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3034
                    undoableDo:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3035
                        codeView insertString:rest atLine:crsrLine col:crsrCol.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3036
                    ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3037
                    info:'Completion'.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3038
                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3039
                codeView cursorRight. "/ kludge to make it visible
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
    actionBlock
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3044
        value:selectors
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3045
        value:editAction
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3046
        value:'selector'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3047
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3048
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3049
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3050
    "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
  3051
    "Modified: / 01-06-2012 / 20:31:36 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3052
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3053
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3054
codeCompletionForVariable:node into:actionBlock
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3055
    |nonMetaClass crsrPos nm parent
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3056
     allVariables allDistances variablesAlreadyAdded nodeVal
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3057
     char oldLen newLen
4485
c6ed849af389 class: DoWhatIMeanSupport
Stefan Vogel <sv@exept.de>
parents: 4484
diff changeset
  3058
     getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  3059
     globalFactor localFactor selectorOfMessageToNode implementors argIdx namesUsed kwPart
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3060
     editAction editActions suggestions nameIsOK longerNames setOfNames otherArgNames
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3061
     suggestionsWithInfo isLeftSideOfAssignment|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3062
 
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  3063
    "/ Transcript show:'var in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3064
    classOrNil notNil ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3065
        nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3066
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3067
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3068
    nm := node name.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3069
    parent := node parent.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3070
    isLeftSideOfAssignment := false.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3071
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3072
    (parent notNil) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3073
        (parent isMessage) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3074
            node == parent receiver ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3075
                selectorOfMessageToNode := parent selector
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3076
            ]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3077
        ] ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3078
            (parent isAssignment) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3079
                isLeftSideOfAssignment := (node == node parent variable).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3080
            ].    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3081
        ].    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3082
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3083
                    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3084
    crsrPos := codeView characterPositionOfCursor.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3085
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3086
    "/ 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
  3087
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3088
    "/ 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
  3089
    char := codeView characterBeforeCursor. 
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3090
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3091
    (isLeftSideOfAssignment not and:[char == Character space]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3092
        nm knownAsSymbol ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3093
            classOrNil isNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3094
                nodeVal := Smalltalk at:nm asSymbol.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3095
            ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3096
                nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3097
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3098
            nodeVal isBehavior ifTrue:[
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3099
                |selectors selectors1 selectors2|
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3100
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3101
                selectors1 := OrderedSet new.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3102
                selectors2 := OrderedSet new.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3103
                nodeVal class 
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3104
                    withAllSuperclassesDo:[:cls |
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3105
                        cls methodDictionary keysAndValuesDo:[:sel :mthd |
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3106
                            |cat|
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3107
                            cat := mthd category asLowercase.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3108
                            cat = 'instance creation' ifTrue:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3109
                                selectors1 add:sel
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3110
                            ] ifFalse:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3111
                                "/ other category: look if it sends new, new: etc.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3112
                                (mthd messagesSent includesAny:#(new new: basicNew basicNew:)) ifTrue:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3113
                                    selectors2 add:sel
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3114
                                ].    
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3115
                            ]
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3116
                        ]
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3117
                    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3118
 
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3119
                selectors := selectors1 order sort , #('-') , selectors2 order sort.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3120
                editActions := selectors collect:[:word | self editActionToInsert:word].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3121
                actionBlock value:selectors value:editActions value:nil.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3122
"/                editAction :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3123
"/                    [:answer |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3124
"/                        |s|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3125
"/                        s := answer isInteger ifTrue:[selectors at:answer] ifFalse:[answer].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3126
"/                        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3127
"/                            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3128
"/                                codeView insertString:s atCharacterPosition:crsrPos.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3129
"/                                codeView cursorToCharacterPosition:crsrPos+s size.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3130
"/                            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3131
"/                            info:'completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3132
"/                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3133
"/                actionBlock value:selectors value:editAction value:nil.
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3134
                ^ self.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3135
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3136
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3137
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3138
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3139
    "/ this is pure voodoo magic (tries to make a good spelling weight,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3140
    "/ by weighting the number of startsWith characters into the spelling distance...)
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3141
    getDistanceComputeBlockWithWeight :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3142
        [:weight |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3143
            [:each |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3144
                |dist factor|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3145
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3146
                dist := each spellAgainst:nm.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3147
                factor := 1.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3148
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3149
                "/ bump the weight-factor if the name string is included
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3150
                (each includesString:nm) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3151
                    (each startsWith:nm) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3152
                        factor := 6 * weight * nm size.
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3153
                    ] ifFalse:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3154
                        nm size > 1 ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3155
                            factor := 4 * weight * nm size
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3156
                        ].    
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3157
                    ].    
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3158
                ] ifFalse:[
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3159
                    (each includesString:nm caseSensitive:false) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3160
                        (each asLowercase startsWith:nm asLowercase) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3161
                            factor := 4 * weight * nm size.
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3162
                        ] ifFalse:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3163
                            nm size > 1 ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3164
                                factor := 2 * weight * nm size.
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3165
                            ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3166
                        ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3167
                    ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3168
                ].    
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3169
                dist := dist + (weight*factor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3170
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3171
                each -> (dist * weight)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3172
             ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3173
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3174
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3175
    nameIsOK := false.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3176
    addWithFactorBlock :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3177
        [:eachNames :factor |
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3178
            |distanceComputeBlock|
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3179
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3180
            distanceComputeBlock := (getDistanceComputeBlockWithWeight value:factor).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3181
            eachNames do:[:nameToAdd |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3182
                (nameToAdd = nm) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3183
                    nameIsOK := true
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3184
                ] ifFalse:[ "/ not again
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3185
                    (variablesAlreadyAdded includes:nameToAdd) ifFalse:[  "/ not again
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3186
                        variablesAlreadyAdded add:nameToAdd.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3187
                        allVariables add:nameToAdd.
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3188
                        allDistances add:(distanceComputeBlock value:nameToAdd).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3189
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3190
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3191
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3192
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3193
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3194
    nm isUppercaseFirst ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3195
        globalFactor := 2.    "/ favour globals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3196
        localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3197
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3198
        globalFactor := 1.    "/ favour locals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3199
        localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3200
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3201
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3202
    variablesAlreadyAdded := Set new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3203
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3204
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3205
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3206
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3207
    (parent notNil
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3208
    and:[parent isMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3209
    and:[parent arguments includes:node]]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3210
        "/ yes -
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3211
        "/ 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
  3212
        "/ of this method, and take that as a basis of the selection
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3213
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3214
        implementors := SystemBrowser
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3215
                            findImplementorsOf:(parent selector)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3216
                            in:(Smalltalk allClasses)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3217
                            ignoreCase:false.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3218
        "/ which argument is it
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3219
        argIdx := parent arguments indexOf:node.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3220
        implementors size > 50 ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3221
            implementors := implementors asOrderedCollection copyTo:50.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3222
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3223
        namesUsed := implementors
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3224
                        collect:[:eachImplementor |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3225
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3226
                            parseTree := eachImplementor parseTree.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3227
                            (parseTree notNil and:[parseTree arguments size > 0])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3228
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3229
                                ifTrue:[ (parseTree arguments at:argIdx) name] ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3230
                        thenSelect:[:a | a notNil].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3231
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3232
        addWithFactorBlock value:namesUsed value:(2 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3233
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3234
        "/ try some commonly used arg names, such as aBoolean, anInteger, etc.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3235
        nm size > 1 ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3236
            |tryClassNamesWith|
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3237
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3238
            ((nm startsWith:'a') and:[(nm at:2) isUppercase]) ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3239
                tryClassNamesWith := 'a'
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3240
            ] ifFalse:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3241
                (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
  3242
                    tryClassNamesWith := 'an'.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3243
                ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3244
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3245
            tryClassNamesWith notNil ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3246
                addWithFactorBlock 
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3247
                    value:(Smalltalk keys 
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3248
                            collect:[:className | tryClassNamesWith,className]
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3249
                            thenSelect:[:name | name startsWith:nm])
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3250
                    value:(1.5 * localFactor)
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3251
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3252
        ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3253
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3254
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3255
            "/ also, look for the keyword before the argument,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3256
            "/ and see if there is such an instVar
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3257
            "/ if so, add it with -Arg
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3258
            parent selector isKeyword ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3259
                kwPart := parent selector keywords at:argIdx.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3260
                (classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3261
                    addWithFactorBlock
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3262
                        value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3263
                        value:(1 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3264
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3265
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3266
            "/ look for the variable names of any other method in that class
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3267
            otherArgNames := Set new.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3268
            classOrNil methodDictionary keysAndValuesDo:[:sel :mthd |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3269
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3270
                            parseTree := mthd parseTree.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3271
                            (parseTree notNil and:[parseTree arguments size > 0])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3272
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3273
                                ifTrue:[ otherArgNames addAll:(parseTree arguments collect:[:each | each name])] ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3274
            addWithFactorBlock value:otherArgNames value:(1.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3275
        ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3276
        addWithFactorBlock 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3277
            value:(codeView previousReplacements 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3278
                                    collect:[:p | p value asString]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3279
                                    thenSelect:[:s | s isValidSmalltalkIdentifier]) 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3280
            value:(1.3 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3281
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3282
        "/ locals in the block/method
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3283
        |names nameSpace|
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3284
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3285
        names := OrderedCollection withAll:node allVariablesOnScope.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3286
        setOfNames := Set withAll:names.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3287
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3288
        rememberedScopeNodes notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3289
            "/ notNil when a parseError occurred.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3290
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3291
                (eachScope isMethod or:[eachScope isBlock]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3292
                    eachScope argumentNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3293
                        (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
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
                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3296
                    eachScope isSequence ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3297
                        eachScope temporaryNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3298
                            (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3299
                        ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3300
                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3301
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3302
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3303
                "/ (setOfNames includesAll:(eachScope allDefinedVariables)) ifFalse:[ self halt].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3304
            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3305
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3306
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3307
                eachScope variableNodesDo:[:var |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3308
                    (setOfNames includes:var name) ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3309
                        names add:var name. setOfNames add:var name
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3310
                    ]
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
        ] ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3314
            "/ 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
  3315
            "/ (further down the code), add them also
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3316
            tree variableNodesDo:[:var |
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3317
                |name|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3318
                
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3319
                name := var name.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3320
                (name first isLowercase or:[isLeftSideOfAssignment not]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3321
                    (setOfNames includes:name) ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3322
                        names add:name. 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3323
                        setOfNames add:name
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3324
                    ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3325
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3326
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3327
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3328
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3329
        addWithFactorBlock value:names value:(4 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3330
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3331
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3332
            "/ instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3333
            addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3334
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3335
            "/ inherited instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3336
            classOrNil superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3337
                addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3338
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3339
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3340
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3341
        "/ magic:
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3342
        "/ 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
  3343
        "/ give names which respond to those messages a higher weight
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3344
        selectorOfMessageToNode notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3345
            |responders nonResponders|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3346
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3347
            "/ responding to that messsage
4365
fda4ed5a9772 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4364
diff changeset
  3348
"/ self halt.
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3349
            classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3350
                "/ private classes
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3351
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3352
                                   value:(2.75 * globalFactor).
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
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3355
                names := nonMetaClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3356
                responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3357
                nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3358
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3359
                addWithFactorBlock value:responders value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3360
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3361
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3362
                "/ superclass var names
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3363
                nonMetaClass allSuperclassesDo:[:superClass |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3364
                    names := superClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3365
                    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3366
                    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3367
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3368
                    addWithFactorBlock value:responders value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3369
                    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3370
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3371
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3372
                isLeftSideOfAssignment ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3373
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3374
                    classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3375
                        names := classOrNil topNameSpace keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3376
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3377
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3378
                        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
  3379
                        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
  3380
                        addWithFactorBlock value:responders value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3381
                        addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3382
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3383
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3384
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3385
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3386
            isLeftSideOfAssignment ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3387
                "/ globals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3388
                names := Smalltalk keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3389
                names := names reject:
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3390
                                [:nm |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3391
                                    (nm includes:$:) and:[ (Smalltalk at:nm) isBehavior not]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3392
                                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3393
                names := names reject:[:nm | nm startsWith:'Undeclared:::' ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3394
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3395
                names := names select:[:nm | nm isUppercaseFirst ] as:OrderedCollection.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3396
                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
  3397
                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
  3398
                addWithFactorBlock value:responders value:(1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3399
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3400
            ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3401
            
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3402
            isLeftSideOfAssignment ifFalse:[ "/ no, we will not suggest assigning to pool vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3403
                classOrNil notNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3404
                    "/ pool variables
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3405
                    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3406
                        |pool names|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3407
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3408
                        pool := Smalltalk at:poolName.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3409
                        names := pool classVarNames.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3410
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3411
                        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
  3412
                        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
  3413
                        addWithFactorBlock value:responders value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3414
                        addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3415
                    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3416
                ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3417
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3418
        ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3419
            classOrNil notNil ifTrue:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3420
                isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3421
                    "/ private classes
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3422
                    addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3423
                                       value:(2.75 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3424
                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3425
                
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3426
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3427
                addWithFactorBlock value:nonMetaClass classVarNames value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3428
                nonMetaClass superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3429
                    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3430
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3431
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3432
                isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3433
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3434
                    classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3435
                        names := classOrNil topNameSpace keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3436
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3437
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3438
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3439
                    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3440
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3441
                    ((nameSpace := classOrNil nameSpace) notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3442
                        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
  3443
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3444
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3445
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
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
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3448
                isLeftSideOfAssignment ifFalse:[ "/ no, we will not suggest assigning to pool vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3449
                    "/ pool variables
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3450
                    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3451
                        |pool names|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3452
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3453
                        pool := Smalltalk at:poolName.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3454
                        pool isNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3455
                            Transcript showCR:'non existent pool: ',poolName
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3456
                        ] ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3457
                            names := pool classVarNames.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3458
                            addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3459
                        ]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3460
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3461
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3462
            ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3463
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3464
            isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3465
                "/ globals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3466
                names := OrderedCollection new.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3467
                Smalltalk keysDo:[:k |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3468
                    (k isUppercaseFirst
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3469
                    and:[ (k startsWith:'Undeclared:::') not
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3470
                    and:[ ((k includes:$:) and:[ (k includesString:'::') not]) not ]]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3471
                        names add:k
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3472
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3473
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3474
            
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3475
                "/ 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
  3476
                "/ otherwise, only consider names with a caseInsensitve prefix match
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3477
                nm first isUppercase ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3478
                    names := names select:[:globalName | globalName asLowercase startsWith: nm].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3479
                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3480
                addWithFactorBlock value:names value:(1.5 * globalFactor).
4665
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3481
            ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3482
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3483
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3484
        isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3485
            "/ pseudos - assuming that thisContext is seldom used.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3486
            "/ also assuming, that nil is short so its usually typed in.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3487
            addWithFactorBlock value:#('self') value:(2.5 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3488
            addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3489
            addWithFactorBlock value:#('super' 'false' 'true') value:(2 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3490
            addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3491
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3492
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3493
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3494
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3495
4410
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3496
"/ nope (foo := foo + 1) should be possible!!
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3497
"/    (parent notNil and:[parent isAssignment]) ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3498
"/        "/ remove the left side of the assignment (to avoid foo := foo suggestions)
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3499
"/        |i|
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3500
"/
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3501
"/        i := allDistances findFirst:[:entry | entry key = parent variable name].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3502
"/        i ~~ 0 ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3503
"/            allDistances removeAtIndex:i
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3504
"/        ].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3505
"/    ].
4385
d3381caeb327 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4382
diff changeset
  3506
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3507
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3508
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3509
                                                           ifTrue:[el]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3510
                                                           ifFalse:[best]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3511
                                                    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3512
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3513
    allDistances sort:[:a :b |
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3514
                                a value > b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3515
                                    true
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3516
                                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3517
                                    a value = b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3518
                                        a key < b key
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3519
                                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3520
                                        false
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3521
                                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3522
                                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3523
                      ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3524
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3525
    allTheBest := allDistances.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3526
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3527
    nameIsOK ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3528
        "/ if the name already exists, only allow longer names, if there are
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3529
        longerNames := allTheBest select:[:assoc | assoc key startsWith:nm].
5033
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3530
        longerNames size < 30 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3531
            longerNames := allTheBest select:[:assoc | assoc key includesString:nm caseSensitive:false].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3532
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3533
        longerNames isEmpty ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3534
            "/ no better name
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3535
            ^ self
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3536
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3537
        allTheBest := longerNames.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3538
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3539
5033
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3540
    allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3541
        allTheBest := allTheBest copyTo:20.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3542
"/        "/ 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
  3543
"/        0.2 to:0.9 by:0.1 do:[:delta |
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3544
"/            |bestValue n|
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3545
"/            
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3546
"/            "/ if still too many, remove more and more
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3547
"/            allTheBest size > 50 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3548
"/                bestValue := bestAssoc value * delta.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3549
"/                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
  3550
"/                n size >= 15 ifTrue:[ allTheBest := n ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3551
"/            ]
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3552
"/        ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3553
"/        allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3554
"/            "/ remove all those which are below some threshold
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3555
"/            0.2 to:0.9 by:0.1 do:[:delta |
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3556
"/                |bestValue n|
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3557
"/                "/ if still too many, remove more and more
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3558
"/                allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3559
"/                    bestValue := bestAssoc value * delta.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3560
"/                    allTheBest := allTheBest select:[:entry | entry value >= bestValue ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3561
"/                ]
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3562
"/            ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3563
"/        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3564
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3565
    suggestions := allTheBest collect:[:assoc | assoc key].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3566
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3567
    "/ finally, the trick is to bring them into a reasonable order...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3568
    "/ sort the prefix matchers by length, the others by spelling distance
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3569
    "/ and bring the prefix-matchers towards the beginning
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3570
    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
  3571
                   ,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3572
                   (suggestions reject:[:s | s startsWith:nm]).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3573
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3574
    "/ if super is among them, add a full call to the completions
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3575
    (suggestions includes:'super') ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3576
        (tree notNil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3577
        and:[ tree isMethod ]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3578
            Error handle:[:ex |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3579
                Transcript showCR:'parse error in code completion ignored'.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3580
            ] do:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3581
                suggestions addFirst:('super ',(Parser methodSpecificationForSelector:tree selector argNames:(tree argumentNames)),'.').
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3582
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3583
        ].
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3584
    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3585
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3586
    suggestionsWithInfo := 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3587
        suggestions 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3588
            collect:[:eachName |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3589
                |val kind valAndKind printString|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3590
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3591
                valAndKind := self valueAndKindOfVariable:eachName.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3592
                valAndKind isNil ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3593
                    eachName
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3594
                ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3595
                    val := valAndKind first.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3596
                    kind := valAndKind second.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3597
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3598
                    val isBehavior ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3599
                        val isLoaded ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3600
                            eachName,' ( ', ('autoloaded class in ',(val category ? 'unknown category')) allItalic,' )'
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3601
                        ] ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3602
                            val isNameSpace ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3603
                                eachName,' ( ', 'namespace' allItalic,' )'
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3604
                            ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3605
                                eachName,' ( ', ('class in ',(val category ? 'unknown category')) allItalic,' )'
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3606
                            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3607
                        ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3608
                    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3609
                        "/ Parser findBest:30 selectorsFor:'isLite' in:nil forCompletion:true
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3610
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3611
                        (val isLiteral and:[ (printString := val printString) size < 15 ]) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3612
                            eachName,' ( ',printString allItalic,' )'
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3613
                        ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3614
                            eachName,' ( ',val classNameWithArticle allItalic,' )'
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3615
                        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3616
                    ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3617
                ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3618
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3619
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3620
    editActions := suggestionsWithInfo collect:[:word |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3621
                     self editActionToReplaceNode:node by:word.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3622
                   ].        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3623
    actionBlock value:suggestionsWithInfo value:editActions value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3624
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3625
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3626
    "Modified: / 16-02-2010 / 10:13:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3627
    "Modified: / 01-05-2016 / 18:45:07 / cg"
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3628
!
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3629
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3630
editActionToInsert:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3631
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3632
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3633
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3634
                codeView insertSelectedStringAtCursor:aString.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3635
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3636
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3637
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3638
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3639
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3640
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3641
editActionToInsertFromSuggestions:suggestions
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3642
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3643
        |answer|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3644
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3645
        answer := suggestions at:index.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3646
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3647
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3648
                codeView insertSelectedStringAtCursor:answer.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3649
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3650
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3651
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3652
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3653
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3654
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3655
editActionToReplaceCodeFrom:start to:stop by:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3656
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3657
        |oldVar oldLen newLen insertWithSpace|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3658
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3659
        insertWithSpace := false.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3660
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3661
        start <= stop ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3662
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3663
        ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3664
            codeView characterBeforeCursor == Character space ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3665
                insertWithSpace := true.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3666
            ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3667
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3668
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3669
        oldLen := stop - start + 1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3670
        newLen := aString size.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3671
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3672
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3673
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3674
                insertWithSpace ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3675
                    codeView insertSelectedStringAtCursor:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3676
                ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3677
                    codeView replaceFromCharacterPosition:start to:stop with:aString.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3678
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3679
                    (aString startsWith:oldVar) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3680
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3681
                    ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3682
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3683
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3684
                ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3685
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3686
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3687
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3688
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3689
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3690
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3691
    "Created: / 01-05-2016 / 18:47:40 / cg"
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3692
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3693
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3694
editActionToReplaceCodeFrom:start to:stop byWordIn:suggestions
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3695
    ^ [:index |
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3696
        |answer oldVar oldLen newLen insertWithSpace|
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3697
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3698
        insertWithSpace := false.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3699
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3700
        answer := suggestions at:index.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3701
        start <= stop ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3702
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3703
        ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3704
            codeView characterBeforeCursor == Character space ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3705
                insertWithSpace := true.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3706
            ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3707
        ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3708
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3709
        oldLen := stop - start + 1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3710
        newLen := answer size.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3711
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3712
        codeView
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3713
            undoableDo:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3714
                insertWithSpace ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3715
                    codeView insertSelectedStringAtCursor:answer
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3716
                ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3717
                    codeView replaceFromCharacterPosition:start to:stop with:answer.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3718
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3719
                    (answer startsWith:oldVar) ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3720
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3721
                    ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3722
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3723
                    ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3724
                ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3725
                codeView dontReplaceSelectionOnInput
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3726
            ]
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3727
            info:'Completion'.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3728
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3729
    ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3730
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3731
    "Created: / 01-05-2016 / 18:47:40 / cg"
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3732
!
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3733
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3734
editActionToReplaceNode:node by:word
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3735
    ^ self editActionToReplaceCodeFrom:node start to:node stop by:word
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3736
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3737
    "Created: / 01-05-2016 / 18:44:09 / cg"
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3738
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3739
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3740
editActionToReplaceNode:node byWordIn:suggestions
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3741
    ^ self editActionToReplaceCodeFrom:node start to:node stop byWordIn:suggestions
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3742
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3743
    "Created: / 01-05-2016 / 18:44:09 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3744
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3745
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3746
findNodeForInterval:interval in:source
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3747
    |tree node|
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
    interval isEmpty ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3750
    RBParser isNil ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3751
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3752
    source = LastSource ifTrue:[
4775
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3753
        tree := LastParseTree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3754
    ] ifFalse:[
4951
570438fc0023 #BUGFIX
mawalch
parents: 4938
diff changeset
  3755
        LastSource := LastParseTree := nil.
4775
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3756
        tree := RBParser
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3757
                parseMethod:source
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3758
                onError:
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3759
                    [:str :err ":nodesSoFar" |
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3760
                        "Transcript showCR:'Parse-Error: ',str."
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3761
                        nil
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3762
                    ].
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3763
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3764
        tree isNil ifTrue:[
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3765
            "/ try to parse as an expression
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3766
            tree := RBParser
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3767
                    parseExpression:source
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3768
                    onError:
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3769
                        [:str :err ":nodesSoFar" |
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3770
                            "Transcript showCR:'Parse-Error: ',str."
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3771
                            nil
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3772
                        ].
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3773
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3774
            tree isNil ifTrue:[
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3775
                ^ nil
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3776
            ].
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3777
        ].
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3778
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3779
        LastSource := source.
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3780
        LastParseTree := tree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3781
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3782
4775
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3783
    Error handle:[:ex |
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3784
    ] do:[ 
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3785
        node := tree whichNodeIsContainedBy:interval.
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3786
    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3787
    node isNil ifTrue: [
4775
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3788
        node := tree bestNodeFor: interval.
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3789
        node isNil ifTrue: [
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3790
            node := self findNodeIn:tree forInterval:interval
66a822518725 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4764
diff changeset
  3791
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3792
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3793
    ^ node
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3794
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3795
    "Modified: / 06-07-2011 / 12:42:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3796
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3797
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3798
findNodeForInterval:interval in:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3799
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3800
	findNodeForInterval:interval in:source allowErrors:allowErrors
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3801
	mustBeMethod:false
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3802
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3803
    "Modified: / 16-09-2011 / 14:52:28 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3804
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3805
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3806
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3807
    "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
  3808
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3809
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3810
	findNodeForInterval:interval in:source allowErrors:allowErrors
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3811
	mustBeMethod:mustBeMethod mustBeExpression:false
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3812
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3813
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3814
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod mustBeExpression:mustBeExpression
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3815
    "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
  3816
     (typically a selection or a word in the source).
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3817
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3818
     parse it as expression or method;
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3819
        if mustBeMethod is true, do not try as expression;
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3820
        if mustBeExpression is true, do not try as method
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3821
     expression syntax parsing is done in workspaces (doIt).
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3822
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3823
     Big hack as workaround a limitation of RBParser:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3824
     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
  3825
     (because the code is written as: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3826
        parentNode addChild:(self parseChild)
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3827
     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
  3828
     However:
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3829
        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
  3830
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3831
     Workaround:
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3832
        remember created nodes as the parse proceeds.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3833
        Thus, I can construct a partial the parent chain.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3834
    "
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3835
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3836
    |intersectingNodes smallestIntersectingNode firstIntersectingNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3837
     lastIntersectingNode onErrorBlock
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3838
     nodeGenerationHook parserClass parser currentScopeNodes bestNode|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3839
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3840
    interval isEmpty ifTrue: [^ nil].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3841
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3842
    languageOrNil notNil ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3843
        parserClass := languageOrNil parserClass.
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3844
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3845
        classOrNil notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3846
            parserClass := classOrNil programmingLanguage parserClass.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3847
        ]
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3848
    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3849
    parserClass notNil ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3850
        "/ hack
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3851
        parserClass == Parser ifTrue: [
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3852
            parserClass := RBParser.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3853
        ].
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3854
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3855
        parserClass := RBParser.
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3856
    ].
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3857
    parserClass isNil ifTrue: [^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3858
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  3859
    rememberedScopeNodes := nil.
4434
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
  3860
    rememberedNodes := OrderedCollection new.
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  3861
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3862
    "/ LastSource := nil.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3863
    source = LastSource ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3864
        tree := LastParseTree.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3865
        tokens := LastScanTokens.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3866
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3867
        intersectingNodes := OrderedCollection new.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3868
        currentScopeNodes := IdentitySet new.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3869
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3870
        onErrorBlock :=
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3871
            [:str :err :nodesSoFar |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3872
                |nodes|
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3873
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3874
                allowErrors ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3875
                    rememberedScopeNodes := currentScopeNodes.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3876
                    firstIntersectingNode notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3877
                        ^ firstIntersectingNode
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3878
                    ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3879
                    nodesSoFar notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3880
                        nodes := nodesSoFar asOrderedCollection
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3881
                                    collect:[:nd | nd whichNodeIntersects:interval]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3882
                                    thenSelect:[:nd | nd notNil ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3883
                        nodes size == 1 ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3884
                            ^ nodes first
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3885
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3886
                    ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3887
                ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3888
                nil
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3889
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3890
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3891
        self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3892
            Transcript show:'looking for: '; showCR:interval.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3893
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3894
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3895
        nodeGenerationHook :=
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3896
            [:node |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3897
                rememberedNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3898
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3899
                "/ 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
  3900
                "/ 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
  3901
                "/ what the semantic interpretation (especially: scope of variable) will be.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3902
                "/ therefore, we parse all, and return the found node at the end.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3903
                (node isMethod or:[node isBlock or:[node isSequence]]) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3904
                    currentScopeNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3905
                ] ifFalse:[
5075
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  3906
"/                    self debuggingCodeFor:#cg is:[
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  3907
"/                        node isMessage ifTrue:[
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  3908
"/                            Transcript show:node; show:' '; show:node start; show:'->'; showCR:node stop.
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  3909
"/                        ].
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  3910
"/                    ].
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3911
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3912
                    (node intersectsInterval:interval) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3913
                        self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3914
                            Transcript showCR:'yes'.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3915
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3916
                        intersectingNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3917
                        firstIntersectingNode isNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3918
                            firstIntersectingNode := lastIntersectingNode := smallestIntersectingNode := node
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3919
                        ] ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3920
                            |lenNode lenSmallest|
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3921
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3922
                            lenNode := (node stop - node start).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3923
                            lenSmallest := (smallestIntersectingNode stop - smallestIntersectingNode start).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3924
                            lenNode < lenSmallest ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3925
                                smallestIntersectingNode := node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3926
                            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3927
                            node start > lastIntersectingNode start ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3928
                                lastIntersectingNode := node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3929
                            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3930
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3931
                    ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3932
                ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3933
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3935
        "/ one of the big problems when using the RBParser here is
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3936
        "/ that it behaves badly when a syntax error is encountered;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3937
        "/ 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
  3938
        "/ completely parsed (for example, a blockNode gets the parent-method only
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3939
        "/ after parsing). Thus, when an error is encountered, we cannot walk
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3940
        "/ 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
  3941
        "/ an inner scope (allVariablesOnScope returns only a partial set).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3942
        "/ 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
  3943
        "/ 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
  3944
        "/ parent gets set eventually, thus we might consider locals from sibling blocks.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3945
        "/ See rememberedScopeNodes handling above.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3946
        "/ Those other nodes are only remembered for failed parses;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3947
        "/ if the parse is ok, rememberedScopeNodes will be nil.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3948
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3949
        mustBeExpression ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3950
            tree := parserClass
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3951
                        parseMethod: source
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3952
                        setup:[:p |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3953
                            parser := p.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3954
                            p rememberNodes:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3955
                            p rememberTokens:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3956
                            p nodeGenerationCallback:nodeGenerationHook
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3957
                        ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3958
                        onError: onErrorBlock.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3959
            parser notNil ifTrue:[ tokens := parser rememberedTokens ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3960
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3961
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3962
        mustBeMethod ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3963
            "/ only cache parsed methods
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3964
            tree notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3965
                LastSource := source.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3966
                LastParseTree := tree.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3967
                LastScanTokens := tokens.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3968
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3969
        ] ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3970
            (tree isNil or:[firstIntersectingNode isNil]) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3971
                "/ try as an expression
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3972
                tree := parserClass
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3973
                            parseExpression: source
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3974
                            setup:[:p |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3975
                                parser := p.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3976
                                p rememberNodes:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3977
                                p rememberTokens:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3978
                                p nodeGenerationCallback:nodeGenerationHook
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3979
                            ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3980
                            onError: onErrorBlock.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3981
                parser notNil ifTrue:[ tokens := parser rememberedTokens ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3982
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3983
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3984
        lastIntersectingNode notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3985
            self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3986
                Transcript show:'last: '; showCR:lastIntersectingNode.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3987
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3988
            ^ lastIntersectingNode
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3989
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3990
        "/ firstIntersectingNode notNil ifTrue:[ ^ firstIntersectingNode ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3991
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3992
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3993
    bestNode := self findNodeForInterval:interval inParseTree:tree.
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3994
    self debuggingCodeFor:#cg is:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3995
        Transcript show:'best: '; showCR:bestNode.
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3996
    ].
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3997
    ^ bestNode
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3998
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3999
    "Created: / 16-09-2011 / 14:52:08 / cg"
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  4000
    "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
  4001
    "Modified (comment): / 01-05-2016 / 10:05:10 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4002
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4003
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4004
findNodeForInterval:interval inParseTree:parseTree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4005
    |node|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4006
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4007
    interval isEmpty ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4008
    parseTree isNil ifTrue:[^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4009
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4010
    node := parseTree whichNodeIsContainedBy:interval.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4011
    node isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4012
	node := parseTree whichNodeIntersects:interval.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4013
	node isNil ifTrue: [
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4014
	    node := self findNodeIn:parseTree forInterval:interval
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4015
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4016
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4017
    ^ node
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4018
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4019
    "Modified: / 10-11-2006 / 13:13:58 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4020
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4021
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4022
findNodeIn:tree forInterval:interval
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4023
    |nodeFound wouldReturn|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4024
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4025
    nodeFound := nil.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4026
    tree nodesDo:[:eachNode |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4027
	(eachNode intersectsInterval:interval) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4028
	    (nodeFound isNil or:[nodeFound == eachNode parent]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4029
		nodeFound := eachNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4030
	    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4031
		(nodeFound parent == eachNode parent
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4032
		and:[ eachNode start >= nodeFound start
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4033
		      and:[ eachNode stop <= nodeFound stop ] ]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4034
		] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4035
		    (nodeFound parent notNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4036
		    and:[nodeFound parent isCascade and:[eachNode parent isCascade]]) ifFalse:[^ nil]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4037
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4038
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4039
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4040
	    nodeFound notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4041
		"/ already found one - beyond that one; leave
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4042
		wouldReturn notNil ifTrue:[wouldReturn := nodeFound].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4043
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4044
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4045
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4046
"/ (wouldReturn notNil and:[wouldReturn ~~ node]) ifTrue:[self halt].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4047
    ^ nodeFound
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4048
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4049
    "Modified: / 20-11-2006 / 12:31:12 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4050
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4051
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4052
insertAdditonalStuffAfterSelector:chosenCompletion
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4053
    |optionalExtraSpace|
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4054
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4055
    optionalExtraSpace := (codeView characterAfterCursor isSeparator)
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4056
                            ifTrue:['']
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4057
                            ifFalse:[' '].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4058
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4059
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4060
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4061
            'ifTrue:' 'ifFalse:' 'ifTrue:ifFalse:' 'ifFalse:ifTrue:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4062
            'and:' 'or:' 'timesRepeat:' 'whileTrue:' 'whileFalse:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4063
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4064
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4065
        codeView insertStringAtCursor:('[',optionalExtraSpace,']').
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4066
        "/ codeView cursorLeft:1+extra size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4067
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4068
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4069
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4070
            'collect:' 'select:' 'reject:' 'do:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4071
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4072
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4073
        codeView insertStringAtCursor:('[:each | ]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4074
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4075
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4076
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4077
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4078
            'contains:' 'findFirst:' 'detect:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4079
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4080
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4081
        codeView insertStringAtCursor:('[:some | ]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4082
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4083
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4084
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4085
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4086
            'remove:ifAbsent:' 'detect:ifNone:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4087
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4088
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4089
        codeView insertStringAtCursor:('[]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4090
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4091
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4092
!
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4093
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4094
messagesSentTo:varName in:aTree
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4095
    |messagesToReceiver collector|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4096
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4097
    collector :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4098
        [:node | 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4099
            (node isMessage 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4100
            and:[node receiver isVariable
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4101
            and:[node receiver name = varName]]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4102
                messagesToReceiver add:(node selector)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4103
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4104
        ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4105
        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4106
    "/ collect messages sent
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4107
    messagesToReceiver := Set new.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4108
    "/ remembered nodes is nonNil if parser aborted with error
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4109
    rememberedNodes notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4110
        rememberedNodes do:collector.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4111
    ] ifFalse:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4112
        tree allMessageNodesDo:collector.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4113
    ]. 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4114
    ^ messagesToReceiver
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4115
!
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4116
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4117
old_askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4118
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4119
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4120
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4121
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4122
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4123
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4124
    LastChoices notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4125
	lastChoice := LastChoices at:what ifAbsent:nil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4126
	lastChoice notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4127
	    "/ move tha last choice to the top of the list, if it is in.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4128
	    (list includes: lastChoice) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4129
		(list indexOf: lastChoice) < 10 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4130
		    list := {lastChoice allBold } , (list copyWithout:lastChoice).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4131
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4132
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4133
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4134
    ].
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
    list size < 30 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4137
	|menu idx exitKey|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4138
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4139
	menu := PopUpMenu labels:list.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4140
	menu hideOnKeyFilter:[:key | |hide|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4141
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4142
		hide ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4143
		    exitKey := key.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4144
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4145
		hide].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4146
	menu memorizeLastSelection:3 "sigh, not 1 because of heading!!".
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4147
	idx := menu startUpWithHeading:'Choose ',what.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4148
	idx == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4149
	    exitKey notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4150
		codeView keyPress:exitKey x:0 y:0.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4151
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4152
	    ^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4153
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4154
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4155
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4156
	resources := codeView application isNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4157
			ifTrue:[ codeView resources]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4158
			ifFalse:[ codeView application resources ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4159
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4160
	choice := Dialog
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4161
	   choose:(resources string:'Choose ',what)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4162
	   fromList:list
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4163
	   lines:20
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4164
	   initialSelection:(list firstIfEmpty:nil)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4165
	   title:(resources string:'Code completion').
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4166
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4167
    ].
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  4168
    choice := choice string.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4169
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4170
    LastChoices isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4171
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4172
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4173
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4174
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4175
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4176
    "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
  4177
    "Modified: / 28-08-2013 / 15:28:01 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4178
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4179
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4180
sortSelectors:list forSelector:selector lcSelector:lcSelector
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4181
    list sort: [:a :b |
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4182
        |aBeforeB|
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4183
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4184
        (a startsWith:selector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4185
            (b startsWith:selector) ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4186
                aBeforeB := true
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4187
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4188
        ] ifFalse:[    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4189
            (b startsWith:selector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4190
                aBeforeB := false
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4191
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4192
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4193
        aBeforeB isNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4194
            aBeforeB := a asLowercase < b asLowercase.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4195
            (a asLowercase startsWith:lcSelector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4196
                (b asLowercase startsWith:lcSelector) ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4197
                    aBeforeB := true
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4198
                ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4199
            ] ifFalse:[    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4200
                (b asLowercase startsWith:lcSelector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4201
                    aBeforeB := false
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4202
                ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4203
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4204
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4205
        aBeforeB
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4206
    ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4207
!
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4208
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4209
sortUsefulSelectorsIn:selectorList
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4210
    "/ cosmetics: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4211
    "/  ifTrue / whileTrue should come before ifFalse/whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4212
    #(
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4213
        ifTrue:         ifFalse:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4214
        ifTrue:ifFalse: ifFalse:ifTrue:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4215
        whileTrue:      whileFalse:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4216
        whileTrue       whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4217
        whileTrue:      whileTrue
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4218
        whileFalse:     whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4219
        new:            basicNew:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4220
        new             basicNew
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4221
    ) pairWiseDo:[:sel1 :sel2 |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4222
        |idx1 idx2|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4223
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4224
        (idx1 := selectorList indexOf:sel1) ~~ 0 ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4225
            (idx2 := selectorList indexOf:sel2) ~~ 0 ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4226
                idx1 > idx2 ifTrue:[ 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4227
                    selectorList swap:idx1 with:idx2
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4228
                ] 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4229
            ] 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4230
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4231
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4232
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4233
    "Created: / 01-05-2016 / 17:48:02 / cg"
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4234
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4235
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4236
splitSelectorList:list by:condition
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4237
    |part1 part2 newList|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4238
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4239
    part1 := list select:condition.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4240
    part2 := list reject:condition.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4241
    part1 isEmpty ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4242
        newList := part2.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4243
    ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4244
        part2 isEmpty ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4245
            newList := part1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4246
        ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4247
            newList := part1 , part2.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4248
        ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4249
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4250
    ^ newList
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4251
!
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4252
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4253
treeForCode:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4254
    |tree|
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
    source = LastSource ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4257
	tree := LastParseTree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4258
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4259
	tree := RBParser
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4260
		parseMethod:source
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4261
		onError: [:str :err :nodesSoFar :parserOrNil|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4262
			allowErrors ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4263
			    "/ parserOrNil isNil if raised by the scanner
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4264
			    parserOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4265
				^ parserOrNil currentMethodNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4266
			    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4267
			].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4268
			^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4269
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4270
		proceedAfterError:false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4271
		rememberNodes:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4272
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4273
	tree notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4274
	    LastSource := source.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4275
	    LastParseTree := tree.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4276
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4277
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4278
    ^ tree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4279
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4280
    "Modified: / 13-01-2012 / 11:54:30 / cg"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4281
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4282
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4283
tryCodeCompletionWithSource:source nodeInterval:interval at:characterPositionOfCursor mustBeExpression:mustBeExpression into:actionBlock
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4284
    "this is tried multiple times;
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4285
        first with cursor line only
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4286
        then with the source copied up to the cursor position,
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4287
        then with the full source.
4381
43de05e6af6c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4379
diff changeset
  4288
     Either one may give better results (for example, when completing
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4289
     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
  4290
     legal, but stupid message send to be parsed...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4291
     (which happens often after inserting)"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4292
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4293
    |node nodeParent checkedNode characterBeforeCursor|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4294
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4295
    "/ this is too naive and stupid; if there is a syntactic error,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4296
    "/ 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
  4297
    "/ 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
  4298
    "/ without any progress.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4299
    "/ 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
  4300
    "/ as it parses the code. Stop, when the interval is hit.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4301
    "/ that will also work for syntactic incorrect source code.
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4302
    (mustBeExpression not and:[methodOrNil notNil or:[classOrNil notNil]]) ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4303
        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
  4304
    ].           
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4305
    node isNil ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4306
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false mustBeExpression:true.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4307
        node isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4308
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4309
            self information:'No parseNode found (syntax error before or in comment?)'.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4310
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4311
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4312
    ].
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4313
    nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4314
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4315
    (node isVariable
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4316
    and:[ nodeParent notNil
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4317
    and:[ nodeParent isMessage
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  4318
    and:[ node stop < (characterPositionOfCursor-1) ]]]) ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4319
        node := nodeParent.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4320
        nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4321
    ].
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4322
    characterPositionOfCursor > source size ifTrue:[^ self].
4525
71ebd312132a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4524
diff changeset
  4323
    characterBeforeCursor := source at:(characterPositionOfCursor-1 max:1). "/ codeView characterBeforeCursor.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4324
    characterBeforeCursor isNil ifTrue:[ "at begin of line" ^ self].
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  4325
    characterBeforeCursor == $. ifTrue:[ "at end of statement" ^ self].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4326
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4327
    node isVariable ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4328
        |nodeIsInTemporaries nodeIsInBlockArguments nodeIsInMethodArguments |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4329
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4330
        nodeIsInTemporaries :=
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4331
            nodeParent notNil
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4332
            and:[ nodeParent isSequence
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4333
            and:[ nodeParent temporaries notEmptyOrNil
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4334
            and:[ node stop <= nodeParent temporaries last stop ]]]. 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4335
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4336
        nodeIsInBlockArguments :=
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4337
            node blockScope notNil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4338
            and:[ node blockScope arguments notEmptyOrNil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4339
            and:[ node stop <= node blockScope arguments last stop ]].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4340
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4341
        (nodeIsInBlockArguments not and:[rememberedScopeNodes notNil]) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4342
            "/ 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
  4343
            nodeIsInBlockArguments := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4344
                rememberedScopeNodes 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4345
                    contains:[:scope |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4346
                        (scope isMethod or:[scope isBlock])
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4347
                        and:[scope arguments notEmpty
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4348
                        and:[scope arguments first start <= node start
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4349
                        and:[scope arguments last stop >= node stop]]].
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
        nodeIsInTemporaries ifTrue:[ ^ self ]. "/ no completion in a tempvar decl 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4353
        nodeIsInBlockArguments ifTrue:[ ^ self ]. "/ no completion in a tempvar decl 
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
        "/ for variable completion, cursor must be right after the node 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4356
        codeView characterPositionOfCursor = (node stop + 1) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4357
            codeView characterBeforeCursor ~= Character space ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4358
                self codeCompletionForVariable:node into:actionBlock.
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4359
                ^ self.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4360
            ]. 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4361
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4362
        "/ nodeParent isNil or:[nodeParent isMessage not]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4363
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4364
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4365
false ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4366
        codeView characterPositionOfCursor = (node stop + 2) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4367
            |classes cls| 
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4368
            "/ after a variable;
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4369
            "/ offer local messages, if receiver type is known
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4370
            classes := (self classesOfNode:node).
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4371
            classes notEmptyOrNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4372
                classes size > 1 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4373
                    cls := classes anElement.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4374
                ] ifFalse:[    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4375
                    cls := Behavior commonSuperclassOf:classes.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4376
                ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4377
            ]. 
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4378
            cls notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4379
                |clsSelectors moreSelectors|
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4380
            
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4381
                "/ completion in a message-send
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4382
                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
  4383
                clsSelectors size < 30 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4384
                    cls superclass notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4385
                        moreSelectors := cls superclass methodDictionary keys.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4386
                        clsSelectors size + moreSelectors size < 30 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4387
                            clsSelectors := clsSelectors , moreSelectors.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4388
                        ].
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4389
                    ].    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4390
                ].
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4391
                "/ self codeCompletionForMessage:checkedNode into:actionBlock.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4392
                actionBlock value:clsSelectors value:nil value:nil.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4393
                ^ self.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4394
            ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4395
        ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4396
].
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4397
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4398
    node isLiteral ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4399
        "/ however, user may want to complete a symbol inside a literal array!!
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4400
        node value isArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4401
            node token isLiteralArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4402
                |elementBeforeCursor searcher|
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4403
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4404
                elementBeforeCursor := node token value detect:[:anElementToken | characterPositionOfCursor == (anElementToken stop + 1)] ifNone:nil.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4405
                elementBeforeCursor isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4406
                    searcher :=
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4407
                        [:tok :check |
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4408
                            tok isLiteralArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4409
                                tok value inject:nil into:[:found :el | found ifNil:[searcher value:el value:check]]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4410
                            ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4411
                                (check value:tok) ifTrue:[tok] ifFalse:[nil]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4412
                            ]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4413
                        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4414
                    elementBeforeCursor := searcher value:node token value:[:anElementToken | characterPositionOfCursor == (anElementToken stop)].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4415
                ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4416
                (elementBeforeCursor notNil and:[ elementBeforeCursor value isSymbol ]) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4417
                    self codeCompletionForLiteralSymbol:nil element:elementBeforeCursor considerAll:true into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4418
                    ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4419
                ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4420
            ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4421
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4422
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4423
        "/ cursor must be right after the literal
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4424
        characterPositionOfCursor == (node stop + 1) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4425
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4426
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4427
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4428
        node value isSymbol ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4429
            self codeCompletionForLiteralSymbol:node element:nil considerAll:false into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4430
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4431
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4432
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4433
        "/ huh - completing strings, numbers or what?
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4434
        (nodeParent notNil
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4435
            and:[ nodeParent isMessage
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4436
            and:[ nodeParent isKeyword ]])
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4437
        ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4438
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4439
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4440
        "/ no, move up and try completing the outer keyword message (next arg)
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4441
        node := nodeParent.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4442
        nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4443
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4444
5050
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4445
    Verbose == true ifTrue:[
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4446
        Transcript show:'node is '.
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4447
        Error ignoreIn:[ Transcript show:node ].
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4448
        Transcript cr.
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4449
    ].
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4450
    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4451
    "/ if in a keyword-argument position...
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4452
    node isMessage ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4453
        "/ where are we?
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4454
        node selector isKeyword ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4455
            characterBeforeCursor == $: ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4456
                |argIdx senders implementors receiverClasses selectorUpToCursor implementorOfSelectorUpToCursor|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4457
                "/ about to enter an argument?
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4458
                argIdx := node selectorParts keysAndValuesDetectKey:[:idx :part |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4459
                            part stop == (codeView characterPositionOfCursor-1). 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4460
                          ] ifNone:nil.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4461
                argIdx notNil ifTrue:[          
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4462
                    selectorUpToCursor := ((node selectorParts collect:#value) copyTo:argIdx) asStringWith:''.        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4463
                    implementors := Set new.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4464
                    "/ 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
  4465
                    "/ this takes too long for a completion;
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4466
                    "/    Smalltalk allClassesDo:[:cls |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4467
                    "/        cls instAndClassMethodsDo:[:m |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4468
                    "/            (m sendsMessageForWhich:[:sel | sel startsWith:node selector]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4469
                    "/                senders add:m
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4470
                    "/            ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4471
                    "/        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4472
                    "/    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4473
                    "/ therefore, restrict to a max. of 5 classes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4474
                    receiverClasses := self classesOfNode:node receiver.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4475
                    (receiverClasses notEmptyOrNil and:[receiverClasses size <= 5]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4476
                        receiverClasses do:[:eachPossibleReceiverClass |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4477
                            eachPossibleReceiverClass withAllSuperclassesDo:[:cls |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4478
                                cls methodDictionary keysAndValuesDo:[:sel :mthd |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4479
                                    (sel startsWith:selectorUpToCursor) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4480
                                        implementors add:mthd.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4481
                                        (sel = selectorUpToCursor) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4482
                                            implementorOfSelectorUpToCursor := implementorOfSelectorUpToCursor ? mthd
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4483
                                        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4484
                                    ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4485
                                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4486
                            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4487
                        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4488
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4489
                    implementorOfSelectorUpToCursor notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4490
                        |tree argName|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4491
                        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4492
                        tree := implementorOfSelectorUpToCursor parseTree.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4493
                        argName := tree argumentNames at:argIdx.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4494
                        (argName includesString:'block' caseSensitive:false) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4495
                            actionBlock value:{'[ "',argName,'" ]'}
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4496
                                        value:{ self editActionToInsert:('[ "',argName,'" ]') }
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4497
                                        value:'block argument'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4498
                        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4499
                    ] ifFalse:[    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4500
                        implementors notEmpty ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4501
                            self halt.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4502
                        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4503
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4504
                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4505
            ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4506
        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4507
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4508
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4509
    (node isVariable or:[node isBlock and:[node stop notNil]]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4510
        (characterPositionOfCursor == (node stop + 1)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4511
        "/ hack (spaces at end of line)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4512
        or:[characterPositionOfCursor == (node stop)]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4513
            codeView characterBeforeCursor == Character space ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4514
                self codeCompletionForMessageTo:node into:actionBlock.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4515
                ^ self
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4516
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4517
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4518
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4519
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4520
    "/ move outward, until we find a message-send node,
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4521
    "/ or the method's selector pattern node.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4522
    checkedNode := node.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4523
    [checkedNode notNil] whileTrue:[
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4524
        (characterPositionOfCursor <= (checkedNode stop ? source size)) ifTrue:[
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4525
            "/ Transcript show:'T: '; showCR:node.
5048
8dbd0140a2f0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5047
diff changeset
  4526
            "/ Transcript showCR:('Inside a ',(checkedNode className)).
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4527
            "/ self information:('Inside a ',(checkedNode className)).
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4528
            (checkedNode isMessage 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4529
            and:[characterPositionOfCursor < (checkedNode selectorParts first start)]) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4530
                self codeCompletionForMessageTo:checkedNode receiver into:actionBlock.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4531
                ^ self
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4532
            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4533
            
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4534
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4535
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4536
        checkedNode isMessage ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4537
            "/ completion in a message-send
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4538
            "/ Transcript showCR:'codeCompletionForMessage'.
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4539
            self codeCompletionForMessage:checkedNode into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4540
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4541
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4542
        checkedNode isMethod ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4543
            "/ completion in a method's selector pattern
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4544
            "/ Transcript showCR:'codeCompletionForMethodSpec'.
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4545
            self codeCompletionForMethodSpec:checkedNode into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4546
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4547
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4548
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4549
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4550
        checkedNode := checkedNode parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4551
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4552
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4553
    "/ Transcript showCR:'Node is neither variable nor message'.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4554
    self information:'Node is neither variable nor message.'.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4555
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4556
    "Modified: / 04-07-2006 / 18:48:26 / fm"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4557
    "Modified: / 01-05-2016 / 19:00:33 / cg"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4558
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4559
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4560
withoutSelectorsUnlikelyFor:aClass from:selectorsArg forPartial:partialSelector
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4561
    "some heuristics;
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4562
     as best selectors has been chosen by implemented methods for aClass,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4563
     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
  4564
     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
  4565
     implement at:put: themself.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4566
     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
  4567
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4568
    |selectors noNilChecks noIsXXXChecks noNoXXXChecks noBecome 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4569
     noIndexedSetters noIndexedGetters noSizeQueries|
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4570
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4571
    aClass isNil ifTrue:[ ^ selectorsArg ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4572
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4573
    noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := false.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4574
    noIndexedSetters := noIndexedGetters := noSizeQueries := false.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4575
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4576
    selectors := (selectorsArg ? #()) asOrderedCollection.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4577
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4578
    self tracePoint:#cg message:aClass.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4579
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4580
    "/ actually meaning booleans here
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4581
    (aClass == True or:[aClass == False]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4582
        noNilChecks := noBecome := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4583
        (partialSelector startsWith:'is') ifFalse:[ noIsXXXChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4584
        (partialSelector startsWith:'no') ifFalse:[ noNoXXXChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4585
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4586
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4587
    (aClass includesBehavior: ArithmeticValue) ifTrue:[ noNilChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4588
    (aClass includesBehavior: Symbol) ifTrue:[ noNilChecks := noBecome := noIndexedSetters := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4589
    (aClass includesBehavior: Number) ifTrue:[ noBecome := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4590
    (aClass includesBehavior: Block) ifTrue:[ noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4591
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4592
    (aClass isMeta) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4593
        noNilChecks := noBecome := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4594
        "/ 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
  4595
        selectors := selectors reject:
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4596
            [:sel |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4597
                (Object implements:sel)
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4598
                and:[ (Smalltalk allImplementorsOf:sel) conform:[:impl | impl isMeta not]]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4599
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4600
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4601
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4602
    aClass isVariable ifFalse:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4603
        noIndexedGetters := noIndexedSetters := noSizeQueries := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4604
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4605
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4606
    noIndexedSetters ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4607
        #( #'at:put:' #'basicAt:put:') do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4608
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4609
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4610
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4611
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4612
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4613
    noIndexedGetters ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4614
        #( #'at:' #'basicAt:') do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4615
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4616
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4617
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4618
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4619
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4620
    noSizeQueries ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4621
        #( #size #basicSize ) do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4622
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4623
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4624
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4625
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4626
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4627
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4628
    noNilChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4629
        selectors removeAllFoundIn:#(
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4630
                    'isNil' 'notNil'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4631
                    'ifNil:' 'ifNotNil:' 'ifNil:ifNotNil:' 'ifNotNil:ifNil:' 'ifNotNilDo:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4632
                    'ifEmpty:' 'ifNotEmpty:' 'ifNotEmptyDo:' 'ifEmpty:ifNotEmpty:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4633
                    'ifEmpty:ifNotEmptyDo:' 'ifNotEmptyDo:ifEmpty:' 'ifEmptyDo:ifNotEmpty:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4634
                  ).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4635
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4636
    noIsXXXChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4637
        "/ get rid of all isXXX selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4638
        selectors := selectors reject:[:sel | sel startsWith:'is'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4639
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4640
    noNoXXXChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4641
        "/ get rid of all notXXX selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4642
        selectors := selectors reject:[:sel | sel startsWith:'no'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4643
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4644
    noBecome ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4645
        "/ get rid of all become* selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4646
        selectors := selectors reject:[:sel | sel startsWith:'become'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4647
        selectors remove:#oneWayBecome: ifAbsent:[].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4648
        selectors := selectors reject:[:sel | sel startsWith:'changeClassTo'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4649
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4650
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4651
    "/ 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
  4652
    selectors := (selectors select:[:sel | aClass implements:sel])
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4653
                 ,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4654
                 (selectors reject:[:sel | aClass implements:sel]).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4655
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4656
    ^ selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4657
! !
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4658
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4659
!DoWhatIMeanSupport methodsFor:'code completion-helpers-naive type inference'!
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4660
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4661
addClassesFromAssignmentTo:varName in:aTree to:setOfTypes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4662
    "/ assignments...
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4663
    aTree allAssignmentNodesDo:[:eachAssignmentNode |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4664
        |exprCls leftSide|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4665
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4666
        leftSide := eachAssignmentNode variable.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4667
        leftSide name = varName ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4668
            exprCls := self classOfNode:eachAssignmentNode value.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4669
            exprCls notNil ifTrue:[ 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4670
                setOfTypes add:exprCls
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4671
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4672
        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4673
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4674
    ^ setOfTypes.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4675
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4676
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4677
addClassesOfBlockVar:variableNode inScope:blockScope to:setOfTypes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4678
    |blockParent|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4679
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4680
    blockParent := blockScope parent.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4681
    (blockParent notNil and:[blockParent isMessage]) ifFalse:[^ setOfTypes].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4682
    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4683
    "/ if the parent of the block is an enumeration message, and the receiver is known,
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4684
    "/ we know the type of argument.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4685
    ( #(do: keysAndValuesDo: select: collect:) includes:blockParent selector) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4686
        |collection|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4687
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4688
        collection := self valueOfNode:blockParent receiver.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4689
        collection notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4690
            (collection isKindOf:Collection) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4691
                collection notEmpty ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4692
                    |someElement|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4693
                    someElement := collection anElement.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4694
                    setOfTypes add:someElement class.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4695
                    ^ setOfTypes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4696
                ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4697
            ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4698
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4699
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4700
    ^ setOfTypes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4701
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4702
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4703
addClassesOfExpression:expr inClass:classOrNil to:setOfTypes
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4704
    |cls exprSelector exprVal varName varScope instVarClass valClass
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4705
     msgSelector msgReceiver msgArg1
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4706
     receiverClasses receiverClass 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4707
     arg1Classes mthd|
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4708
    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4709
    expr isLiteral ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4710
        exprVal := expr value.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4711
        cls := exprVal class.         
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4712
        (exprVal isArray or:[ exprVal isByteArray or:[ exprVal isString ]]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4713
            exprVal isImmutable ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4714
                setOfTypes add:cls mutableClass.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4715
                ^ setOfTypes.    
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4716
            ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4717
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4718
        setOfTypes add:cls. 
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4719
        ^ setOfTypes.    
5070
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
    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4722
    expr isBlock ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4723
        setOfTypes add:Block. 
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4724
        ^ setOfTypes.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4725
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4726
    (exprVal := self valueOfNode:expr) notNil ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4727
        "/ knowing the value is always great!!
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4728
        setOfTypes add:exprVal class.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4729
        ^ setOfTypes.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4730
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4731
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4732
    expr isVariable ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4733
        varName := expr name.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4734
        varName = 'self' ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4735
            setOfTypes add:(classOrNil ? UndefinedObject).
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4736
            ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4737
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4738
        varName = 'super' ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4739
            classOrNil isNil 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4740
                ifTrue:[setOfTypes add:Object]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4741
                ifFalse:[setOfTypes add:classOrNil superclass].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4742
            ^ setOfTypes.    
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4743
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4744
        varName = 'thisContext' ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4745
            setOfTypes add:Context.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4746
            ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4747
        ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4748
        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4749
        varScope := expr whoDefines: varName.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4750
        (varScope notNil) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4751
            (varScope isBlock) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4752
                self addClassesOfBlockVar:expr inScope:varScope to:setOfTypes.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4753
                ^ setOfTypes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4754
            ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4755
            (varScope isMethod) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4756
                setOfTypes addAll:( self classesFromAssignmentTo:varName in:varScope ).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4757
                ^ setOfTypes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4758
            ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4759
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4760
        
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4761
        classOrNil notNil ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4762
            instVarClass := classOrNil whichClassDefinesInstVar:varName.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4763
            instVarClass notNil ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4764
                setOfTypes addAll:(self classesOfInstVarNamed:varName inClass:instVarClass).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4765
            ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4766
        ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4767
        ^ setOfTypes
5070
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
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4770
    expr isMessage ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4771
        msgSelector := expr selector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4772
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4773
        "/ heuristic: quickly assume boolean for some:
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
                isNil notNil isEmpty isEmptyOrNil notEmpty notEmptyOrNil
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4777
                > >= < <= = == ~ ~=
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4778
                knownAsSymbol
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4779
                isMeta 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4780
                includes: contains:
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4781
                not and: or:
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4782
                exists atEnd positive negative odd even
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4783
            ) includes:msgSelector
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4784
        ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4785
            setOfTypes add:True. "/ use True, because boolean does not include the full protocol
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4786
            ^ setOfTypes    
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4787
        ].
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
        msgReceiver := expr receiver.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4790
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4791
        "/ some hardwired knowlegde here
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4792
        receiverClasses := self classesOfNode:msgReceiver.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4793
        receiverClass := receiverClasses size == 1 ifTrue:[receiverClasses anElement] ifFalse:[nil].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4794
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4795
        receiverClass notNil ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4796
            ( #(copy shallowCopy) includes:exprSelector ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4797
                setOfTypes addAll:receiverClasses.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4798
                ^ setOfTypes.
5070
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
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4801
            msgSelector == #theNonMetaclass ifTrue:[  
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4802
                setOfTypes add:receiverClass theNonMetaclass class.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4803
                ^ setOfTypes            
5070
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
            msgSelector == #theMetaclass ifTrue:[  
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4806
                setOfTypes add:receiverClass theMetaclass class.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4807
                ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4808
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4809
            msgSelector == #class ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4810
                setOfTypes add:receiverClass class.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4811
                ^ setOfTypes.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4812
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4813
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4814
            receiverClass isBehavior ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4815
                mthd := receiverClass lookupMethodFor:msgSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4816
                receiverClass isMeta ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4817
                    ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: msgSelector ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4818
                        setOfTypes add:receiverClass theNonMetaclass.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4819
                        ^ setOfTypes.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4820
                    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4821
                    "/ if that method sends one of new/basicNew/new:/basicNew:, assume it returns an instance of itself
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4822
                    mthd notNil ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4823
                        ( mthd sendsAny:#( #'new' #'basicNew' #'new:' #'basicNew:' )) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4824
                            setOfTypes add:receiverClass theNonMetaclass.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4825
                            ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4826
                        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4827
                    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4828
                ] ifFalse:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4829
                    mthd notNil ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4830
                        (ParseTreeSearcher methodIsSetterMethod:mthd) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4831
                            setOfTypes add:receiverClass.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4832
                            ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4833
                        ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4834
                    ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4835
                ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4836
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4837
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4838
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4839
        ((msgSelector startsWith:'as')
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4840
        and:[ (valClass := Smalltalk classNamed:(msgSelector copyFrom:3)) notNil ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4841
        ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4842
            setOfTypes add:valClass.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4843
            ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4844
        ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4845
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4846
        ((msgSelector startsWith:'is')
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4847
        and:[ (valClass := Smalltalk classNamed:(msgSelector copyFrom:3)) notNil ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4848
        ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4849
            setOfTypes add:True. "/ Boolean - not boolean; it does not contain the full protocol (would not find ifTrue:)
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4850
            ^ setOfTypes.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4851
        ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4852
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4853
        #(
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4854
            size                    SmallInteger
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4855
            hash                    SmallInteger
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4856
            identityHash            SmallInteger
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4857
            class                   Class
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4858
            theMetaclass            Metaclass
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4859
            theNonMetaclass         Class
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4860
            fork                    Process
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4861
            newProcess              Process
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4862
        ) pairWiseDo:[:sel :clsName |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4863
            msgSelector == sel ifTrue:[ 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4864
                setOfTypes add:(Smalltalk at:clsName).
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4865
                ^ setOfTypes.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4866
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4867
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4868
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4869
        ( #( bitAnd: bitOr: bitShift: rightShift: >> << highBit lowBit ) includes:msgSelector) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4870
            "/ assume integer
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4871
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4872
            setOfTypes add:Integer.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4873
            ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4874
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4875
        ( #( + - * // \\ ) includes:msgSelector) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4876
            "/ assume numeric
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4877
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4878
            setOfTypes add:Number.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4879
            ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4880
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4881
        msgSelector == #/ ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4882
            ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Number]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4883
                setOfTypes add:Number.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4884
                ^ setOfTypes.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4885
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4886
            msgArg1 := expr arg1.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4887
            arg1Classes := ((self classesOfNode:msgArg1) ? #()).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4888
            (arg1Classes contains:[:cls | cls includesBehavior:Number]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4889
                setOfTypes add:Number.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4890
                ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4891
            ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4892
        ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4893
        ( #( construct: / ) includes:msgSelector) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4894
            ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Filename]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4895
                setOfTypes add:Filename.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4896
                ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4897
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4898
        ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4899
    ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4900
    ^ setOfTypes
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4901
!
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4902
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4903
addClassesOfInstVarNamed:varName inClass:aClass to:setOfTypes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4904
    |instIndex|
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4905
    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4906
    instIndex := aClass instVarIndexFor:varName.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4907
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4908
    "/ look for instances
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4909
    aClass allSubInstancesDo:[:i |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4910
        |varClass|
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4911
        varClass := (i instVarAt:instIndex) class.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4912
        setOfTypes add:varClass.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4913
    ].  
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4914
    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4915
    "/ look for assignments in code
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4916
    aClass withAllSubclassesDo:[:eachClass |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4917
        eachClass methodDictionary do:[:m |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4918
            |tree code visitor|
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4919
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4920
            "/ quick check
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4921
            code := m source.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4922
            (code notNil and:[code includesString:varName]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4923
                tree := Parser parse:code class:eachClass.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4924
                (tree notNil and:[tree ~~ #Error]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4925
                    visitor := PluggableParseNodeVisitor new. 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4926
                    visitor 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4927
                        actionForNodeClass:AssignmentNode 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4928
                        put:[:node |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4929
                            |val expr exprSelector|
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4930
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4931
                            node variable name = varName ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4932
                                expr := node expression.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4933
                                "/ only look for wellknown types on the right side.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4934
                                expr isLiteral ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4935
                                    val := expr evaluate.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4936
                                    val isArray ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4937
                                        setOfTypes add:Array 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4938
                                    ] ifFalse:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4939
                                        setOfTypes add:val class
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4940
                                    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4941
                                ] ifFalse:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4942
                                    expr isMessage ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4943
                                        exprSelector := expr selector. 
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4944
                                        ( #(+ - * /) includes:exprSelector ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4945
                                            setOfTypes add:Number
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4946
                                        ] ifFalse:[    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4947
                                            ( #(// size) includes:exprSelector ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4948
                                                setOfTypes add:Integer
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4949
                                            ] ifFalse:[    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4950
                                                ( #(copy shallowCopy) includes:exprSelector ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4951
                                                ] ifFalse:[    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4952
                                                    ( #(new new: basicNew basicNew:) includes:exprSelector ) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4953
                                                        expr receiver isGlobal ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4954
                                                            setOfTypes add:expr receiver evaluate
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4955
                                                        ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4956
                                                    ] ifFalse:[    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4957
self breakPoint:#cg.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4958
                                                    ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4959
                                                ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4960
                                            ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4961
                                        ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4962
                                    ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4963
                                ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4964
                            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4965
                            true "/ yes - visit subnodes
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4966
                        ].        
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4967
                    visitor visit:tree.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4968
                ].    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4969
            ]    
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4970
        ]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4971
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4972
    ^ setOfTypes
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4973
!
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4974
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4975
classOfNode:aNode
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4976
    "returns the class of a receiver, if it is well-known.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4977
     Otherwise nil (either unknown, or multiple possibilities)
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4978
     When showing possible completions for a message,
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4979
     it is a good idea to know what the kind receiver is."
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4980
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4981
    | classes |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4982
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4983
    classes := self classesOfNode:aNode.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4984
    classes size == 1 ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4985
        ^ classes anElement
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4986
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4987
    ^ nil
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4988
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4989
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4990
classesFromAssignmentTo:varName in:aTree
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4991
    ^ self addClassesFromAssignmentTo:varName in:aTree to:IdentitySet new
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4992
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4993
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4994
classesOfInstVarNamed:varName inClass:aClass
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4995
    ^ self addClassesOfInstVarNamed:varName inClass:aClass to:(IdentitySet new)
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4996
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4997
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4998
classesOfNode:aNode
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4999
    "returns the set of possible classes of a parsenode.
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  5000
     or nil if unknown.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  5001
     When showing possible completions for a message,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  5002
     it is a good idea to know what the kind receiver is."
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  5003
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  5004
    ^ self addClassesOfExpression:aNode inClass:classOrNil to:(IdentitySet new).
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  5005
!
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  5006
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5007
valueAndKindOfVariable:aVariableName
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5008
    "when showing possible completions for a variable,
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5009
     it is a good idea to know what the reveiver's value is.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  5010
     Sigh - returns nil as value both if unknown AND if a real nil is there"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5011
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5012
    |nodeVal con privateClass pool|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5013
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5014
    aVariableName isUppercaseFirst ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5015
        classOrNil notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5016
            (classOrNil theNonMetaclass classVarNames includes:aVariableName) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5017
                nodeVal := classOrNil theNonMetaclass classVarAt:aVariableName.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5018
                ^ { nodeVal . #classVariable }
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5019
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5020
            privateClass := classOrNil theNonMetaclass privateClasses detect:[:cls | cls nameWithoutPrefix = aVariableName] ifNone:nil.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5021
            privateClass notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5022
                nodeVal := privateClass.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5023
                ^ { nodeVal . #privateClass }
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5024
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5025
            pool := classOrNil theNonMetaclass sharedPools detect:[:pool | pool classVariableNames includes:aVariableName] ifNone:nil.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5026
            pool notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5027
                nodeVal := pool classVarAt:aVariableName.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5028
                ^ { nodeVal . #poolVariable }
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5029
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5030
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5031
        aVariableName knownAsSymbol ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5032
            nodeVal := Smalltalk at:aVariableName asSymbol.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5033
            nodeVal notNil ifTrue:[     
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5034
                ^ { nodeVal . #global }
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5035
            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5036
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5037
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5038
        "/ 'evaluate' the variable (like in a browser's codeView)
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5039
        "/ mhmh - will we catch workspace vars then?
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5040
        Error handle:[:ex |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5041
        ] do:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5042
            nodeVal := Parser new evaluate:aVariableName in:classOrNil receiver:classOrNil.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5043
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5044
        nodeVal notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5045
            ^ { nodeVal . #global }
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5046
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5047
        ^ nil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5048
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5049
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5050
    aVariableName = 'self' ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5051
        (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  5052
            ^ { classOrNil "theNonMetaclass" . #pseudoVar }
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  5053
            "/ ^ { classOrNil . #pseudoVar }
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5054
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5055
        contextOrNil notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5056
            ^ { contextOrNil receiver . #pseudoVar } 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5057
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5058
        ^ nil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5059
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5060
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5061
    contextOrNil notNil ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  5062
        "/ in the debugger, we know more
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5063
        con := contextOrNil.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5064
        [ con notNil ] whileTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5065
            "/ a local in the context?
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5066
            ((con argAndVarNames ? #()) includes:aVariableName) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5067
                nodeVal := con argsAndVars at:(con argAndVarNames indexOf:aVariableName) ifAbsent:nil.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5068
                nodeVal notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5069
                    ^ { nodeVal . #argument }
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5070
                ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5071
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5072
            con := con home.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5073
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5074
        "/ an instvar
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5075
        (contextOrNil receiver class allInstVarNames includes:aVariableName) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5076
            nodeVal := contextOrNil receiver instVarNamed:aVariableName.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5077
            nodeVal notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5078
                ^ { nodeVal . #instanceVariable }
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5079
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5080
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5081
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5082
    ^ nil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5083
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5084
    "Created: / 01-05-2016 / 12:40:05 / cg"
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  5085
!
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  5086
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5087
valueOfNode:aNode
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5088
    "when showing possible completions for a message,
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5089
     it is a good idea to know what the reveiver's value is.
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5090
     Sigh - returns nil both if unknown AND if a real nil is there."
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5091
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5092
    |nodeSelector nodeReceiver isNonDestructive receiverValue method impl|
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5093
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5094
    aNode isLiteral ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5095
        ^ aNode value
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5096
    ].
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5097
    aNode isVariable ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5098
        ^ self valueOfVariable:aNode name.
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5099
    ].
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5100
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5101
    aNode isMessage ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5102
        nodeSelector := aNode selector.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5103
        nodeReceiver := aNode receiver.
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5104
                
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5105
        "/ some hardwired knowlegde here
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5106
        classOrNil notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5107
            (nodeReceiver isSelf and:[nodeSelector = #'class']) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5108
                ^ classOrNil
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5109
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5110
        ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5111
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5112
        receiverValue := self valueOfNode:nodeReceiver.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5113
        receiverValue notNil ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5114
            isNonDestructive := false.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5115
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5116
            "/ some are wellknown
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5117
            nodeSelector == #size ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5118
                "/ mhm - be conservative; someone might have redefined #size
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5119
                impl := receiverValue class whichClassIncludesSelector:nodeSelector.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5120
                "/ more hardwired stuff.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5121
                ((impl == Object) or:[(impl == String) or:[impl isSubclassOf:Collection]]) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5122
                    isNonDestructive := true.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5123
                ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5124
            ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5125
        
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5126
            ( #( basicSize
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5127
                 class theMetaclass theNonMetaclass ) includes:nodeSelector) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5128
                isNonDestructive := true.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5129
            ] ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5130
                "/ follow non-destructive accessors
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5131
                method := receiverValue class lookupMethodFor:nodeSelector.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5132
                method notNil ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5133
                    (ParseTreeSearcher methodIsJustReturningSomething:method) ifTrue:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5134
                        "/ we can savely call that method to get the current value
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5135
                        isNonDestructive := true.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5136
                    ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5137
                ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5138
            ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5139
            isNonDestructive ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5140
                 ^ receiverValue perform: nodeSelector.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  5141
            ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5142
        ].
4422
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5143
    ].
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5144
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5145
    ^ nil
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5146
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5147
    "Created: / 28-08-2013 / 16:34:53 / cg"
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5148
!
ee7c441fce69 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4421
diff changeset
  5149
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5150
valueOfVariable:aVariableName
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5151
    "when showing possible completions for a variable,
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5152
     it is a good idea to know what the reveiver's value is.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5153
     Sigh - returns nil both if unknown AND if a real nil is there."
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5154
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5155
    |valueAndKind|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5156
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5157
    (valueAndKind := self valueAndKindOfVariable:aVariableName) notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5158
        self assert:valueAndKind isArray.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5159
        ^ valueAndKind first.
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5160
    ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  5161
    ^ nil
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5162
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  5163
    "Modified: / 01-05-2016 / 12:41:30 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5164
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5165
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5166
!DoWhatIMeanSupport methodsFor:'code completion-helpers-old'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5167
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5168
codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5169
    |sym possibleCompletions best start stop oldLen newLen oldVar|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5170
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5171
    sym := node value.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5172
    possibleCompletions := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5173
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5174
    Symbol allInstancesDo:[:existingSym |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5175
	(existingSym startsWith:sym) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5176
	    (existingSym = sym) ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5177
		possibleCompletions add:existingSym
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5178
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5179
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5180
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5181
    possibleCompletions sort.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5182
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5183
    best := possibleCompletions longestCommonPrefix.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5184
    (best = sym or:[(possibleCompletions includes:best) not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5185
	best := self askUserForCompletion:'symbol literal' for:codeView at: node start from:possibleCompletions.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5186
	best isNil ifTrue:[^ self].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5187
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5188
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5189
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5190
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5191
    start := node start.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5192
    stop := node stop.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5193
    (codeView characterAtCharacterPosition:start) == $# ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5194
	start := start + 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5195
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5196
    (codeView characterAtCharacterPosition:start) == $' ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5197
	start := start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5198
	stop := stop - 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5199
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5200
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5201
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5202
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5203
    codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5204
	undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5205
	info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5206
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5207
    (best startsWith:oldVar) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5208
	oldLen := stop - start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5209
	newLen := best size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5210
	codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5211
	codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5212
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5213
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5214
    "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
  5215
    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5216
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5217
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5218
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
  5219
    "going to be OBSOLETE"
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5220
    
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5221
    |selector
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5222
     bestSelectors selector2 bestSelectors2 bestSelectorsFromRB allBest best numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5223
     newParts nSelParts oldLen newLen selectorParts
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5224
     findBest parentNode selectorInBest selector2InBest2
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5225
     parser selectorsSentInCode selectorsImplementedInClass
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5226
     varName rbTypes rbType tryParent parentIsKeywordMessage parentIsBinaryMessage rcvrClass|
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5227
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5228
    RefactoryTyper notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5229
        "/ refactory package also provides a (very limited) typer;
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5230
        "/ 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
  5231
        (node receiver isVariable) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5232
            varName := node receiver name.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5233
            varName isUppercaseFirst ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5234
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5235
                tree := RBParser
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5236
                            parseMethod:codeView contents string
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5237
                            onError:[:aString :pos | nil].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5238
                tree notNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5239
                    rbTypes := RefactoryTyper
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5240
                                classesFor: varName
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5241
                                in: tree
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5242
                                model: nil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5243
                                ignoredSelectors:(Array with:node selector).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5244
                    rbTypes size > 0 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5245
                        rbTypes size > 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5246
                            rbTypes remove:ProtoObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5247
                            rbTypes remove:Autoload ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5248
                            rbTypes remove:ObsoleteObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5249
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5250
                        rbTypes size == 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5251
                            rbType := rbTypes first.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5252
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5253
                            rbType := Class commonSuperclassOf:rbTypes
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5254
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5255
                        (rbType notNil "and:[rbType ~= Object]") ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5256
                            bestSelectorsFromRB := Parser findBest:30 selectorsFor:node selector in:rbType forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5257
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5258
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5259
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5260
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5261
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5262
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5263
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5264
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5265
        parser := Parser parseMethod:codeView contents string in:classOrNil ignoreErrors:true ignoreWarnings:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5266
        selectorsSentInCode := parser messagesSent.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5267
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5268
    classOrNil notNil ifTrue:[
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5269
        selectorsImplementedInClass := Set new.
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5270
        classOrNil withAllSuperclassesDo:[:cls |
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5271
            cls theNonMetaclass ~~ Object ifTrue:[
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5272
                selectorsImplementedInClass addAll:cls selectors.
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5273
            ]
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  5274
        ]    
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5275
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5276
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5277
    findBest := [:node :selector |
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5278
        |srchClasses bestSelectors bestPrefixes|
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5279
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  5280
        codeView withCursor:(Cursor questionMark) do:[
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5281
            srchClasses := self classesOfNode:node receiver.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5282
            srchClasses notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5283
                bestSelectors := Set new.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5284
                srchClasses do:[:each |
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  5285
                    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
  5286
                ]    
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5287
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5288
                bestSelectors := Parser findBest:30 selectorsFor:selector in:nil forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5289
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5290
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5291
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5292
        (bestSelectors includes:selector) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5293
            bestSelectors := bestSelectors select:[:sel | sel size > selector size].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5294
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5295
        bestSelectors
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5296
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5297
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5298
    selector := node selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5299
    bestSelectors := findBest value:node value:selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5300
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5301
    parentNode := node parent.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5302
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5303
    parentIsKeywordMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5304
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5305
            and:[ parentNode isMessage
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5306
            and:[ parentNode selector isKeyword]]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5307
    parentIsBinaryMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5308
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5309
            and:[ parentNode isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5310
            and:[ parentNode selector isBinarySelector]]).
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5311
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5312
    tryParent := false.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5313
    "/ if its 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
  5314
    (node selector isUnarySelector and:[ parentIsKeywordMessage ]) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5315
        tryParent := true.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5316
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5317
        "/ 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
  5318
        (node isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5319
        and:[ node receiver isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5320
        and:[ node receiver receiver isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5321
        and:[ node receiver receiver name isUppercaseFirst
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5322
        and:[ #(new new:) includes:(selector2 := node receiver selector) ]]]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5323
            rcvrClass := Smalltalk classNamed:(node receiver receiver name).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5324
            "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5325
            bestSelectors := Parser findBest:30 selectorsFor:selector in:rcvrClass forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5326
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5327
            "/ also, if nothing was found
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5328
            (bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5329
            and:[ parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5330
            and:[ parentNode isMessage ]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5331
                "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5332
                "/ selector2 := parentNode selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5333
                "/ selector2 := selector2,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5334
                bestSelectors := findBest value:parentNode value:selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5335
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5336
        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5337
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5338
    tryParent ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5339
        selector2 := parentNode selector,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5340
        bestSelectors2 := findBest value:parentNode value:selector2.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5341
    ].
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5342
    bestSelectorsFromRB notEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5343
        bestSelectors := bestSelectorsFromRB , (bestSelectors reject:[:sel | bestSelectorsFromRB includes:sel]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5344
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5346
    "/ if the parent is a keyword selector, the child cannot
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  5347
    (parentIsKeywordMessage or:[parentIsBinaryMessage]) ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5348
        bestSelectors := bestSelectors reject:[:sel | sel isKeyword]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5349
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5350
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5351
    bestSelectors2 isEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5352
        allBest := bestSelectors.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5353
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5354
        bestSelectors isEmptyOrNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5355
            allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5356
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5357
            selectorInBest := (bestSelectors contains:[:sel | sel asLowercase startsWith:selector asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5358
            selector2InBest2 := (bestSelectors2 contains:[:sel | sel asLowercase startsWith:selector2 asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5359
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5360
            (selectorInBest not and:[ selector2InBest2 ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5361
                "/ selector2 is more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5362
                allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5363
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5364
                (selectorInBest and:[ selector2InBest2 not ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5365
                    "/ selector more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5366
                    allBest := bestSelectors
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5367
                ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5368
                    "/ assume same likelyness
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5369
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5370
                    allBest := bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5371
                                ifTrue:[ bestSelectors2 ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5372
                                ifFalse:[ bestSelectors , #(nil) , bestSelectors2 ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5373
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5374
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5375
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5376
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5377
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5378
    allBest isEmptyOrNil ifTrue:[ ^ self ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5379
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5380
    selectorsImplementedInClass notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5381
        "/ 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
  5382
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5383
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5384
                    by:[:sel | selectorsImplementedInClass includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5385
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5386
    selectorsSentInCode notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5387
        "/ 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
  5388
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5389
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5390
                    by:[:sel | selectorsSentInCode includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5391
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5392
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5393
    "/ 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
  5394
    allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5395
                splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  5396
                by:[:sel | sel notNil and:[sel startsWith:selector]].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5397
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5398
    best := allBest first.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5399
    allBest size > 1 ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5400
        "allBest size < 20 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5401
            |idx|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5402
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5403
            idx := (PopUpMenu labels:allBest) startUp.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5404
            idx == 0 ifTrue:[ ^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5405
            best := allBest at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5406
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5407
            allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5408
            best := Dialog request:'Matching selectors:' initialAnswer:best list:allBest.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5409
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5410
        ]."
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5411
        allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5412
        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
  5413
        best isEmptyOrNil ifTrue:[^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5414
        best = '-' ifTrue:[^ self].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5415
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5416
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5417
"/    srchClass notNil ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5418
"/        implClass := srchClass whichClassIncludesSelector:best.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5419
"/    ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5420
"/        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
  5421
"/        implClass size == 1 ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5422
"/            implClass := implClass first.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5423
"/        ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5424
"/            implClass := nil
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5425
"/        ]
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5426
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5427
"/
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5428
"/    info := best storeString.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5429
"/    implClass notNil ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5430
"/        info := implClass name , ' >> ' , info.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5431
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5432
"/    self information:info.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5433
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5434
    best ~= selector ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5435
        numArgs := best numArgs.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5436
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5437
        (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:best]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5438
            selectorParts := parentNode selectorParts , node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5439
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5440
            selectorParts := node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5441
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5442
        nSelParts := selectorParts size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5443
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5444
        newParts := best asCollectionOfSubstringsSeparatedBy:$:.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5445
        newParts := newParts select:[:part | part size > 0].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5446
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5447
        codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5448
            undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5449
                |newCursorPosition stop|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5450
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5451
                numArgs > nSelParts ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5452
                    stop := selectorParts last stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5453
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5454
                    "/ append the rest ...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5455
                    numArgs downTo:nSelParts+1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5456
                        |newPart|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5457
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5458
                        newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5459
                        (best endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5460
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5461
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5462
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5463
                        (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5464
                            newPart := ':' , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5465
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5466
                        newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5467
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5468
                        codeView replaceFromCharacterPosition:stop to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5469
                        newCursorPosition := stop + newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5470
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5471
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5472
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5473
                (nSelParts min:newParts size) downTo:1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5474
                    |newPart oldPartialToken start stop nextChar|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5475
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5476
                    newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5477
                    oldPartialToken := selectorParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5478
                    start := oldPartialToken start.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5479
                    stop := oldPartialToken stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5480
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5481
                    (best isKeyword) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5482
                        (oldPartialToken value endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5483
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5484
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5485
                            (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5486
                                newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5487
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5488
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5489
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5490
                        (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5491
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5492
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5493
                            nextChar := codeView characterAtCharacterPosition:stop+1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5494
                            nextChar isSeparator ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5495
                                (').' includes:nextChar) ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5496
                                    newPart := newPart , ' '
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5497
                                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5498
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5499
                        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5500
"/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5501
"/                        ] ifFalse:[
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5502
"/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5503
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5504
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5505
                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5506
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5507
                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5508
                    newCursorPosition isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5509
                        oldLen := stop - start + 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5510
                        newLen := newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5511
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5512
                        newCursorPosition := stop + (newLen-oldLen)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5513
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5514
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5515
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5516
                codeView cursorToCharacterPosition:newCursorPosition.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5517
                codeView cursorRight.  "/ avoid going to the next line !!
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5518
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5519
                ((best endsWith:':') and:[numArgs == 1]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5520
                    |impls impl|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5521
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5522
                    "/ see if it expects a block argument (heuristic)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5523
                    best := best asSymbol.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5524
                    (node notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5525
                    and:[classOrNil notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5526
                    and:[node receiver isSelf]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5527
                        (impl := classOrNil whichClassImplements:best) isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5528
                            impls := #().
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5529
                            Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5530
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5531
                            impls := { impl }
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5532
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5533
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5534
                        impls := Smalltalk allImplementorsOf:best.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5535
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5536
                    (impls contains:[:cls |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5537
                        |argName|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5538
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5539
                        argName := ((cls compiledMethodAt:best) methodArgAndVarNames at:1) asLowercase.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5540
                        (argName includesString:'block') or:[ (argName includesString:'action')]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5541
                    ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5542
                        codeView insertStringAtCursor:'['
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5543
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5544
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5545
                codeView dontReplaceSelectionOnInput.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5546
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5547
        info:'Completion'.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5548
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5549
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5550
    "Created: / 10-11-2006 / 13:18:27 / cg"
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5551
    "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
  5552
    "Modified: / 30-04-2016 / 18:21:21 / cg"
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5553
!
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5554
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5555
codeCompletionForVariable:node inClass:classOrNil codeView:codeView
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5556
    |parent nonMetaClass crsrPos nm
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5557
     allVariables allDistances best nodeVal
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5558
     char start stop oldLen newLen oldVar
4485
c6ed849af389 class: DoWhatIMeanSupport
Stefan Vogel <sv@exept.de>
parents: 4484
diff changeset
  5559
     getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5560
     globalFactor localFactor selectorOfMessageToNode tree implementors argIdx namesUsed kwPart|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5561
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5562
    classOrNil notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5563
	nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5564
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5565
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5566
    nm := node name.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5567
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5568
    "/ 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
  5569
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5570
    "/ If the variable represents a global, present its instance creation messages
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5571
    crsrPos := codeView characterPositionOfCursor.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5572
    char := codeView characterAtCharacterPosition:crsrPos-1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5573
    char isSeparator ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5574
	classOrNil isNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5575
	    nodeVal := Smalltalk at:nm asSymbol.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5576
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5577
	    nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5578
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5579
	nodeVal isBehavior ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5580
	    |methods menu exitKey idx|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5581
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5582
	    methods := nodeVal class methodDictionary values
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5583
			    select:[:m | |cat|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5584
				cat := m category asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5585
				cat = 'instance creation'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5586
			    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5587
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5588
	    menu := PopUpMenu labels:(methods collect:[:each | each selector]).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5589
	    menu hideOnKeyFilter:[:key | |hide|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5590
		    hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5591
		    hide ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5592
			exitKey := key.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5593
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5594
		    hide].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5595
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5596
	    idx := menu startUp.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5597
	    idx == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5598
		exitKey notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5599
		    codeView keyPress:exitKey x:0 y:0.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5600
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5601
		^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5602
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5603
	    best := (methods at:idx) selector.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5604
	    codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5605
		undoableDo:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5606
		    codeView insertString:best atCharacterPosition:crsrPos.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5607
		    codeView cursorToCharacterPosition:crsrPos+best size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5608
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5609
		info:'completion'.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5610
	    ^ self.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5611
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5612
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5613
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5614
    ((parent := node parent) notNil and:[parent isMessage]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5615
	node == parent receiver ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5616
	    selectorOfMessageToNode := parent selector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5617
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5618
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5619
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5620
    getDistanceComputeBlockWithWeight :=
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5621
	[:weight |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5622
	    [:each |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5623
		|dist factor|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5624
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5625
		dist := each spellAgainst:nm.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5626
		factor := 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5627
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5628
		(each startsWith:nm) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5629
		    factor := 6 * nm size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5630
		] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5631
		    (each asLowercase startsWith:nm asLowercase) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5632
			factor := 4 * nm size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5633
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5634
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5635
		dist := dist + (weight*factor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5636
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5637
		each -> (dist * weight)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5638
	     ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5639
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5640
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5641
    addWithFactorBlock :=
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5642
	[:eachNames :factor | |namesToAdd|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5643
	    namesToAdd := eachNames select:[:nameToAdd | nameToAdd ~= nm ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5644
	    namesToAdd := namesToAdd reject:[:each | allVariables includes:each ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5645
	    allVariables addAll:namesToAdd.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5646
	    allDistances addAll:(namesToAdd collect:(getDistanceComputeBlockWithWeight value:factor)).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5647
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5648
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5649
    nm isUppercaseFirst ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5650
	globalFactor := 2.    "/ favour globals
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5651
	localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5652
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5653
	globalFactor := 1.    "/ favour locals
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5654
	localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5655
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5656
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5657
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5658
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5659
4308
f1c31624744d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4304
diff changeset
  5660
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5661
    ((parent := node parent) notNil
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5662
    and:[parent isMethod
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5663
    and:[parent arguments includes:node]]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5664
	"/ now thats cool: look how the naem of this argument is in other implementations
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5665
	"/ of this method, and take that as a basis of the selection
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5666
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5667
	implementors := SystemBrowser
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5668
			    findImplementorsOf:(parent selector)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5669
			    in:(Smalltalk allClasses)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5670
			    ignoreCase:false.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5671
	"/ which argument is it
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5672
	argIdx := parent arguments indexOf:node.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5673
	implementors size > 50 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5674
	    implementors := implementors asOrderedCollection copyTo:50.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5675
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5676
	namesUsed := implementors
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5677
			collect:[:eachImplementor |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5678
			    |parseTree|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5679
			    parseTree := eachImplementor parseTree.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5680
			    (parseTree notNil and:[parseTree arguments size > 0])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5681
				ifFalse:nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5682
				ifTrue:[ (parseTree arguments at:argIdx) name] ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5683
			thenSelect:[:a | a notNil] as:Set.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5684
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5685
	addWithFactorBlock value:namesUsed value:(2 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5686
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5687
	classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5688
	    "/ also, look for the keyword before the argument,
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5689
	    "/ and see if there is such an instVar
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5690
	    "/ if so, add it with -Arg
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5691
	    parent selector isKeyword ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5692
		kwPart := parent selector keywords at:argIdx.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5693
		(classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5694
		    addWithFactorBlock
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5695
			value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5696
			value:(1 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5697
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5698
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5699
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5700
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5701
	classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5702
	    "/ locals in the block/method
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5703
	    |names|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5704
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5705
	    names := node allVariablesOnScope.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5706
	    "/ if there were no variables (due to a parse error)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5707
	    "/ do another parse and see what we have
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5708
	    names isEmpty ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5709
		tree := self treeForCode:(codeView contentsAsString string) allowErrors:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5710
		"/ better if we already have a body (include locals then)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5711
		"/ otherwise, only the arguments are considered
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5712
		tree notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5713
		    names := (tree body ? tree) allVariablesOnScope.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5714
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5715
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5716
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5717
	    addWithFactorBlock value:names value:(4 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5718
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5719
	    "/ instance variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5720
	    addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5721
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5722
	    "/ inherited instance variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5723
	    classOrNil superclass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5724
		addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5725
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5726
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5727
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5728
	selectorOfMessageToNode notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5729
	    |names responders nonResponders|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5730
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5731
	    "/ responding to that messsage
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5732
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5733
	    classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5734
		"/ private classes
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5735
		addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5736
				   value:(1.75 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5737
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5738
		"/ class variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5739
		names := nonMetaClass classVarNames.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5740
		responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5741
		nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5742
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5743
		addWithFactorBlock value:responders value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5744
		addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5745
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5746
		"/ superclass var names
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5747
		nonMetaClass allSuperclassesDo:[:superClass |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5748
		    names := superClass classVarNames.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5749
		    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5750
		    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5751
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5752
		    addWithFactorBlock value:responders value:(1 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5753
		    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5754
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5755
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5756
		"/ namespace vars
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5757
		classOrNil nameSpace ~~ Smalltalk ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5758
		    names := classOrNil topNameSpace keys.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5759
		    names := names reject:[:nm | nm includes:$:].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5760
		    names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5761
		    responders := names select:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5762
		    nonResponders := names reject:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5763
		    addWithFactorBlock value:responders value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5764
		    addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5765
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5766
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5767
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5768
	    "/ globals
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5769
	    names := Smalltalk keys.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5770
	    "/ names := names reject:[:nm | nm includes:$:].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5771
	    names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5772
	    responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5773
	    nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5774
	    addWithFactorBlock value:responders value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5775
	    addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5776
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5777
	    "/ pool variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5778
	    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5779
		|pool|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5780
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5781
		pool := Smalltalk at:poolName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5782
		names := pool classVarNames.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5783
		names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5784
		responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5785
		nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5786
		addWithFactorBlock value:responders value:(2.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5787
		addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5788
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5789
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5790
	    |names|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5791
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5792
	    classOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5793
		"/ private classes
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5794
		addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5795
				   value:(1.75 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5796
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5797
		"/ class variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5798
		addWithFactorBlock value:nonMetaClass classVarNames value:(2.0 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5799
		classOrNil superclass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5800
		    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.0 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5801
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5802
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5803
		"/ namespace vars
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5804
		classOrNil nameSpace ~~ Smalltalk ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5805
		    names := classOrNil nameSpace isNameSpace ifTrue:[classOrNil nameSpace keys] ifFalse:[classOrNil nameSpace privateClasses collect:[:c | c nameWithoutPrefix]].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5806
		    names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5807
		    addWithFactorBlock value:names value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5808
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5809
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5810
		"/ pool variables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5811
		classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5812
		    |pool|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5813
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5814
		    pool := Smalltalk at:poolName.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5815
		    names := pool classVarNames.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5816
		    addWithFactorBlock value:names value:(2.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5817
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5818
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5819
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5820
	    "/ globals
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5821
	    names := Smalltalk keys.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5822
	    names := names select:[:nm | nm isUppercaseFirst ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5823
	    addWithFactorBlock value:names value:(1.5 * globalFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5824
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5825
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5826
	"/ pseudos - assuming that thisContext is seldom used.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5827
	"/ also assuming, that nil is short so its usually typed in.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5828
	addWithFactorBlock value:#('self') value:(2.5 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5829
	addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5830
	addWithFactorBlock value:#('super' 'false') value:(2 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5831
	addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5832
	addWithFactorBlock value:#('true') value:(1 * localFactor).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5833
	addWithFactorBlock value:#('false') value:(1 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5834
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5835
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5836
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5837
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5838
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5839
							   ifTrue:[el]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5840
							   ifFalse:[best]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5841
						    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5842
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5843
    allDistances sort:[:a :b |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5844
				a value > b value ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5845
				    true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5846
				] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5847
				    a value = b value ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5848
					a key < b key
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5849
				    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5850
					false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5851
				    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5852
				]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5853
		      ].
4340
b7b73a78385a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4339
diff changeset
  5854
    ((allTheBest := allDistances) count:[:entry | entry value]) > 20 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5855
	allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.5)].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5856
	allTheBest size > 15 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5857
	    allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.8)].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5858
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5859
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5860
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5861
    start := node start.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5862
    stop := node stop.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5863
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5864
    best := self askUserForCompletion:('Variable for "%1"' bindWith:node name)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5865
		 for:codeView at: start
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5866
		 from:(allTheBest collect:[:assoc | assoc key]).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5867
    best isNil ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5868
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5869
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5870
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5871
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5872
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5873
    codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5874
	undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5875
	info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5876
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5877
    (best startsWith:oldVar) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5878
	oldLen := stop - start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5879
	newLen := best size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5880
	codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5881
	codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5882
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5883
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5884
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5885
    "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
  5886
    "Modified: / 28-08-2013 / 15:37:28 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5887
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5888
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5889
!DoWhatIMeanSupport::InputCompletionResult class methodsFor:'instance creation'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5890
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5891
bestName:bestNameArg matchingNames:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5892
    ^ self with:bestNameArg with:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5893
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5894
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5895
     self bestName:123 matchingNames:345
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5896
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5897
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5898
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5899
!DoWhatIMeanSupport::InputCompletionResult methodsFor:'accessing'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5900
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5901
bestName
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5902
    ^ self at:1
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5903
!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5904
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5905
matchingNames
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5906
    ^ self at:2
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5907
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  5908
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  5909
!DoWhatIMeanSupport class methodsFor:'documentation'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  5910
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  5911
version
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  5912
    ^ '$Header$'
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  5913
!
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  5914
3761
6584390d427d dont forget pool variables when looking for the best variable match
Claus Gittinger <cg@exept.de>
parents: 3751
diff changeset
  5915
version_CVS
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  5916
    ^ '$Header$'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  5917
! !
4194
e677aae984be Refactoring:
Stefan Vogel <sv@exept.de>
parents: 4148
diff changeset
  5918