DoWhatIMeanSupport.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 07 Feb 2019 12:16:15 +0000
branchjv
changeset 6065 e880a0b1320b
parent 5814 70d07365a2d4
child 6263 07778cf8704b
permissions -rw-r--r--
Fix copy & paste in `TerminalView` Fix various copy-paste bugs and weirdnesses, namly: * preserve new lines when copying multi-line contents from terminal view. * preserve cursor position when selecting text both via mouse and via double-click.
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
5814
70d07365a2d4 Copyright updates
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 5433
diff changeset
     3
 COPYRIGHT (c) 2015 Jan Vrany
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
     4
	      All Rights Reserved
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 This software is furnished under a license and may be used
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 only in accordance with the terms of that license and with the
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 inclusion of the above copyright notice.   This software may not
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 be provided or otherwise made available to, or used by, any
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 other person.  No title to or ownership of the software is
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 hereby transferred.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"{ Package: 'stx:libwidg2' }"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
    15
"{ NameSpace: Smalltalk }"
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
    16
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
Object subclass:#DoWhatIMeanSupport
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
    18
	instanceVariableNames:'tree tokens languageOrNil classOrNil methodOrNil contextOrNil
4434
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
    19
		instanceOrNil codeView rememberedScopeNodes rememberedNodes
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
    20
		codeAspect'
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
    21
	classVariableNames:'LastSource LastParseTree LastScanTokens LastChoices
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
    22
		LastCompletedSelectors Verbose'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
	poolDictionaries:''
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
	category:'System-Support'
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    27
Array variableSubclass:#InputCompletionResult
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    28
	instanceVariableNames:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    29
	classVariableNames:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    30
	poolDictionaries:''
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    31
	privateIn:DoWhatIMeanSupport
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    32
!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
    33
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
!DoWhatIMeanSupport class methodsFor:'documentation'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
copyright
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
 COPYRIGHT (c) 2002 by eXept Software AG
5814
70d07365a2d4 Copyright updates
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 5433
diff changeset
    39
 COPYRIGHT (c) 2015 Jan Vrany
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    40
	      All Rights Reserved
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
 This software is furnished under a license and may be used
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
 only in accordance with the terms of that license and with the
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
 inclusion of the above copyright notice.   This software may not
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
 be provided or otherwise made available to, or used by, any
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
 other person.  No title to or ownership of the software is
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
 hereby transferred.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
"
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
documentation
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    53
    Attention: this is currently being rewritten and refactored.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    54
    Don't get mad at the ugly (and duplicate) code.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    55
    Will cleanup when finished.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
    56
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    misc collected UI support (functional)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    58
    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
    59
    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
    60
    places.
3667
acb358ca4b0b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3660
diff changeset
    61
    Therefore it is:
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    62
	1) not needed for standalone executables
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    63
	2) published here to avoid multiple implementations
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    [author:]
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    66
	Claus Gittinger (cg@exept.de)
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
3299
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
! !
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    70
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    71
!DoWhatIMeanSupport class methodsFor:'code completion'!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
    72
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    73
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
    74
    "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
    75
     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
    76
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    77
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    78
     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
    79
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    80
    ^ self new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    81
        codeCompletionFor: aspect
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    82
        language: languageOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    83
        method:methodOrNil orClass:classOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    84
        context:contextOrNil
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    85
        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
    86
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    87
    "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
    88
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
    89
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
    90
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
    91
    "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
    92
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    93
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    94
     because we actually know what a variable's type is."
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
    95
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
    96
    ^ self new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    97
        codeCompletionForLanguage: languageOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    98
        class:classOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
    99
        context:contextOrNil 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
   100
        codeView:codeView
4391
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
    "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
   103
! !
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
!DoWhatIMeanSupport class methodsFor:'code completion - obsolete'!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   106
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   107
codeCompletionForClass:classOrNil context:contextOrNil codeView:codeView
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   108
    <resource: #obsolete>
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   109
    "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
   110
     nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   111
     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
   112
     This is not yet done, sigh"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   113
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   114
    ^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   115
	codeCompletionForLanguage: nil class:classOrNil context:contextOrNil codeView:codeView
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   116
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
   117
    "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
   118
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   119
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   120
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
   121
    <resource: #obsolete>
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   122
    "contextOrNil is the current context, if this is called from the debugger;
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   123
     nil, if called from the browser.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   124
     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
   125
     This is not yet done, sigh"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   126
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   127
    ^ self new
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   128
	codeCompletionForMethod:methodOrNil orClass:classOrNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   129
	context:contextOrNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   130
	codeView:codeView into:actionBlock
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   131
! !
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   132
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   133
!DoWhatIMeanSupport class methodsFor:'code completion-helpers'!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   134
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   135
findNodeForInterval:interval in:source
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   136
    "utility"
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   137
    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   138
    |tree node remember|
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   139
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   140
    interval isEmpty ifTrue: [^ nil].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   141
    RBParser isNil ifTrue: [^ nil].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   142
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   143
    source = LastSource ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   144
        tree := LastParseTree.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   145
    ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   146
        remember := true.    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   147
        LastSource := LastParseTree := nil.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   148
        tree := RBParser
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   149
                parseMethod:source
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   150
                onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   151
                    [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   152
                        "/ Transcript showCR:'Parse-Error: ',str.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   153
                        nil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   154
                    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   155
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   156
        tree isNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   157
            "/ try to parse as an expression
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   158
            tree := RBParser
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   159
                    parseExpression:source
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   160
                    onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   161
                        [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   162
                            "Transcript showCR:'Parse-Error: ',str."
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   163
                            nil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   164
                        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   165
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   166
            tree isNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   167
                "/ try to parse the selected text alone as expression
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   168
                remember := false.    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   169
                tree := RBParser
5274
fd14014f5fba #BUGFIX by Maren
matilk
parents: 5272
diff changeset
   170
                    parseExpression:(source copyFrom:interval start to:(interval stop min:source size))
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   171
                    onError:
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   172
                        [:str :err ":nodesSoFar" |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   173
                            "Transcript showCR:'Parse-Error: ',str."
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   174
                            nil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   175
                        ].         
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   176
                ^ tree
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   177
            ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   178
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   179
        remember ifTrue:[ 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   180
            LastSource := source.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   181
            LastParseTree := tree.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   182
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   183
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   184
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   185
    Error handle:[:ex |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   186
    ] do:[ 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   187
        node := tree whichNodeIsContainedBy:interval.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   188
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   189
    node isNil ifTrue: [
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   190
        node := tree bestNodeFor: interval.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   191
        node isNil ifTrue: [
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   192
            node := self findNodeIn:tree forInterval:interval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   193
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   194
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   195
    ^ node
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   196
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   197
    "Modified: / 06-07-2011 / 12:42:53 / cg"
3300
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   198
!
e0f4bf68e26a codeCompletion refactored
Claus Gittinger <cg@exept.de>
parents: 3299
diff changeset
   199
3299
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   200
findNodeForInterval:interval in:source allowErrors:allowErrors
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   201
    ^ self new findNodeForInterval:interval in:source allowErrors:allowErrors
4080
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   202
!
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   203
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   204
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
413b8c8a0161 added: #findNodeForInterval:in:allowErrors:mustBeMethod:
Claus Gittinger <cg@exept.de>
parents: 4070
diff changeset
   205
    "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
   206
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   207
    ^ self new
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   208
	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
   209
!
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   210
40e860fd2f02 argument-name completion in a methods selector pattern
Claus Gittinger <cg@exept.de>
parents: 3303
diff changeset
   211
findNodeForInterval:interval inParseTree:parseTree
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
   212
    ^ 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
   213
!
1cd4b22434a6 code completion stuff moved to here (for reuse)
Claus Gittinger <cg@exept.de>
parents: 3198
diff changeset
   214
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   215
findNodeIn:aTree forInterval:anInterval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   216
    "utility"
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   217
    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   218
    |nodeFound wouldReturn|
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   219
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   220
    anInterval isEmpty ifTrue:[^nil].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   221
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   222
    nodeFound := nil.
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   223
    aTree nodesDo:[:eachNode |
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   224
        (eachNode intersectsInterval:anInterval) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   225
            (nodeFound isNil or:[nodeFound == eachNode parent]) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   226
                nodeFound := eachNode
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   227
            ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   228
                (nodeFound parent == eachNode parent
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   229
                and:[ eachNode start >= nodeFound start
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   230
                      and:[ eachNode stop <= nodeFound stop ] ]) ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   231
                ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   232
                    (nodeFound parent notNil
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   233
                    and:[nodeFound parent isCascade and:[eachNode parent isCascade]]) ifFalse:[^ nil]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   234
                ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   235
            ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   236
        ] ifFalse:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   237
            nodeFound notNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   238
                "/ already found one - beyond that one; leave
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   239
                wouldReturn notNil ifTrue:[wouldReturn := nodeFound].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   240
            ]
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   241
        ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   242
    ].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   243
"/ (wouldReturn notNil and:[wouldReturn ~~ node]) ifTrue:[self halt].
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   244
    ^ nodeFound
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   245
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
   246
    "Modified: / 20-11-2006 / 12:31:12 / cg"
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   249
!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
   250
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   251
classCategoryCompletion:aPartialCategory inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   252
    "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
   253
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   254
		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
   255
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   256
    |matches best lcName|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   257
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   258
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   259
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   260
    "/ search for exact match
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   261
    anEnvironment allClassesDo:[:aClass |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   262
	|category|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   263
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   264
	category := aClass category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   265
	(category notNil and:[category startsWith:aPartialCategory]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   266
	    matches add:category
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   267
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   268
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   269
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   270
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   271
	lcName := aPartialCategory asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   272
	anEnvironment allClassesDo:[:aClass |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   273
	    |category|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   274
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   275
	    category := aClass category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   276
	    (category notNil and:[category asLowercase startsWith:lcName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   277
		matches add:category
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   278
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   279
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   280
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   281
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   282
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   283
	^ 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
   284
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   285
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   286
	^ 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
   287
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   288
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   289
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   290
    ^ 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
   291
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   292
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   293
     Smalltalk classCategoryCompletion:'Sys'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   294
     Smalltalk classCategoryCompletion:'System'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   295
     Smalltalk classCategoryCompletion:'System-BinaryStorage'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   296
    "
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   297
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   298
    "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
   299
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   300
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   301
classNameEntryCompletionBlock
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   302
    "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
   303
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   304
    ^ self entryCompletionBlockFor:#'classnameCompletion:inEnvironment:'
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   305
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   306
    "Modified: / 10-08-2006 / 13:22:02 / cg"
2830
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   307
!
dbf8a7499ebc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   308
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   309
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
   310
    "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
   311
     2 entries: 1st: the best (longest) match
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   312
                2nd: collection consisting of matching names"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   313
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   314
    |searchName matches matchedNamesWithoutPrefix ignCaseMatches best isMatchString cls nsPrefix
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   315
     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
   316
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   317
    (words := aPartialClassName asCollectionOfWords) size > 1 ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   318
        w1 := words first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   319
        w2 := words second.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   320
        rslt := self classnameCompletion:w1 filter:filterBlock inEnvironment:anEnvironment.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   321
        bestMatch := rslt first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   322
        matches := rslt second.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   323
        ('class' copyTo:(w2 size min:5)) = w2 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   324
            matches := matches collect:[:m | m , ' class'].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   325
            bestMatch := bestMatch , ' class'.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   326
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   327
        ^ InputCompletionResult bestName:bestMatch matchingNames:matches
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   328
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   329
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   330
    (aPartialClassName startsWith:'Smalltalk::') ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   331
        nsPrefix := 'Smalltalk::'.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   332
        searchName := aPartialClassName withoutPrefix:'Smalltalk::'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   333
    ] ifFalse:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   334
        nsPrefix := ''.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   335
        searchName := aPartialClassName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   336
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   337
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   338
    searchName := searchName asUppercaseFirst.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   339
    lcSearchName := searchName asLowercase.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   340
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   341
    isMatchString := searchName includesMatchCharacters.
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   342
    (searchName size > 2 
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   343
        and:[ searchName first = $* 
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   344
        and:[ searchName last = $* ]]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   345
    ) ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   346
        isMatchString := false.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   347
        searchName := searchName unquote:$*.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   348
    ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   349
    
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   350
    searchName isEmpty ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   351
        matches := Smalltalk allClassesForWhich:filterBlock.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   352
        ^ InputCompletionResult bestName:searchName matchingNames:#()
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   353
    ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   354
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   355
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   356
    matchedNamesWithoutPrefix := Set new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   357
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   358
    others := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   359
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   360
    tryToMatch :=
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   361
        [:className :fullClassName|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   362
            |addIt|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   363
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   364
            isMatchString ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   365
                addIt := searchName match:className
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   366
            ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   367
                addIt := className includesString:searchName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   368
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   369
            addIt ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   370
                matches add:(nsPrefix , fullClassName).
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   371
                matchedNamesWithoutPrefix add:className.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   372
            ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   373
                "/ try ignoring case
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   374
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   375
                isMatchString ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   376
                    addIt := searchName match:className caseSensitive:false
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   377
                ] ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   378
                    addIt := className includesString:lcSearchName caseSensitive:false.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   379
                    addIt ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   380
                        others add:className
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   381
                    ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   382
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   383
                addIt ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   384
                    ignCaseMatches add:(nsPrefix , fullClassName).
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   385
                    matchedNamesWithoutPrefix add:className.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   386
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   387
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   388
            addIt
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   389
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   390
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   391
    anEnvironment allClassesForWhich:filterBlock do:[:aClass |
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   392
        |addIt fullClassName classNameWithoutPrefix|
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   393
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   394
        aClass isMeta ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   395
            fullClassName := aClass name.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   396
            classNameWithoutPrefix := aClass nameWithoutPrefix.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   397
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   398
            addIt := tryToMatch value:fullClassName value:fullClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   399
            addIt ifFalse:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   400
                classNameWithoutPrefix ~~ fullClassName ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   401
                    tryToMatch value:classNameWithoutPrefix value:fullClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   402
                ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   403
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   404
        ]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   405
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   406
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   407
"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   408
"/        matches := ignCaseMatches.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   409
"/    ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   410
    matches := matches , ignCaseMatches.
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   411
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   412
"/    matches isEmpty ifTrue:[
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   413
"/        matches := ignCaseMatches.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   414
"/
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   415
"/"/    matches isEmpty ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   416
"/"/        | nearBy |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   417
"/"/        nearBy := SortedCollection new sortBlock:[:a :b | a key < b key].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   418
"/"/        others do:[:className |
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   419
"/"/            |lcClassName dist cmpName|
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   420
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   421
"/"/            lcClassName := className asLowercase.
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   422
"/"/            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
   423
"/"/
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   424
"/"/            cmpName := lcClassName copyTo:(lcSearchName size min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   425
"/"/            dist := dist min:(cmpName levenshteinTo:lcSearchName s:9 k:1 c:0 i:9 d:2).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   426
"/"/            cmpName := lcClassName copyTo:(lcSearchName size + 1 min:lcClassName size).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   427
"/"/            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
   428
"/"/            dist < 4 ifTrue:[
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   429
"/"/                nearBy add:( dist -> (nsPrefix , className) ).
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   430
"/"/            ]
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   431
"/"/        ].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   432
"/"/        matches := nearBy collect:[:eachPair | eachPair value].
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   433
"/"/    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   434
"/    ].
3876
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   435
6e63fce83590 fixed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3867
diff changeset
   436
    matches isEmpty ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   437
        ^ InputCompletionResult bestName:searchName matchingNames:(Array with:searchName)
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   438
    ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   439
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   440
    matches size == 1 ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   441
        best := matches first.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   442
        ^ 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
   443
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   444
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   445
    matches
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   446
        sort:[:name1 :name2 |
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   447
            "name1 comes before:name2 iff"
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   448
            ((name2 includes:$:) and:[(name1 includes:$:) not])
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   449
            or:[ ((name1 includes:$:) == (name2 includes:$:))
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   450
                  and:[ (name1 size < name2 size)
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   451
                        or: [ name1 < name2 ]]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   452
               ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   453
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   454
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   455
    isMatchString ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   456
        best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   457
    ] ifFalse:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   458
        matchesForLongestPrefix := matches select:[:m | m asLowercase startsWith:lcSearchName].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   459
        best := ignCaseMatches isEmpty
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   460
                    ifTrue:[ matchesForLongestPrefix longestCommonPrefix ]
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   461
                    ifFalse:[ matchesForLongestPrefix longestCommonPrefixCaseSensitive:false ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   462
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   463
        best size < aPartialClassName size "best size == 0" ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   464
            best := matchedNamesWithoutPrefix longestCommonPrefix.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   465
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   466
        best size == 0 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   467
            "if tried again, return next match"
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   468
            idx := ((matches indexOf:aPartialClassName) + 1) \\ matches size.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   469
            idx ~~ 1 ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   470
                ^ InputCompletionResult bestName:(matches at:idx) matchingNames:(matches asArray)
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   471
            ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   472
        ].
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   473
        best size < aPartialClassName size ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   474
            best := aPartialClassName.
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   475
        ].
2661
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
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   478
    cls := anEnvironment classNamed:best.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   479
    (cls isBehavior and:[cls isNameSpace]) ifTrue:[
5052
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   480
        (matches conform:[:each | each = best
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   481
                                 or:[each startsWith:(best , '::')]])
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   482
        ifTrue:[
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   483
            best := best , '::'
4df885d2b30f #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5051
diff changeset
   484
        ].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   485
    ].
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
   486
    ^ 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
   487
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   488
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   489
     Smalltalk classnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   490
     Smalltalk classnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   491
     Smalltalk classnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   492
     Smalltalk classnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   493
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   494
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   495
    "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
   496
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   497
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   498
classnameCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   499
    "given a partial classname, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   500
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   501
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   502
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   503
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   504
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   505
	filter:[:cls | true]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   506
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   507
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   508
    "
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   509
     self classnameCompletion:'Arr'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   510
     self classnameCompletion:'Arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   511
     self classnameCompletion:'arra'  inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   512
     self classnameCompletion:'*rray' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   513
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   514
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   515
    "Created: / 24-11-1995 / 17:24:45 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   516
    "Modified: / 10-08-2006 / 13:01:30 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   517
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   518
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   519
entryCompletionBlockFor:completionSelector
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   520
    "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
   521
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   522
    ^ [:contents :field  |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   523
	  |s what m|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   524
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   525
	  s := contents withoutSpaces.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   526
	  field topView withCursor:(Cursor questionMark) do:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   527
	      what := self perform:completionSelector with:s with:Smalltalk.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   528
	  ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   529
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   530
	  field contents:(what first).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   531
	  (what at:2) size ~~ 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   532
	      UserPreferences current beepInEditor ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   533
		field device beep
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   534
	      ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   535
	  ]
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   536
      ].
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   537
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   538
    "Created: / 10-08-2006 / 13:21:37 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   539
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   540
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   541
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   542
    "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
   543
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   544
		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
   545
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   546
    ^ self globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:true
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   547
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   548
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   549
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   550
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   551
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   552
     Smalltalk globalnameCompletion:'*rray'
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   553
    "
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   554
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   555
    "Created: / 10-08-2006 / 13:06:23 / cg"
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   556
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   557
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   558
globalNameCompletion:aPartialGlobalName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   559
    "given a partial globalName, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   560
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   561
		2nd: collection consisting of matching names"
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   562
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   563
    |searchName matches ignCaseMatches best isMatchString|
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   564
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   565
    searchName := aPartialGlobalName.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   566
    searchName isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   567
	^ Array with:searchName with:#()
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   568
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   569
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   570
    (searchName at:1) isLowercase ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   571
	searchName := searchName copy asUppercaseFirst
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   572
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   573
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   574
    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
   575
    matches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   576
    ignCaseMatches := OrderedCollection new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   577
    anEnvironment keysDo:[:aGlobalName |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   578
	| addIt|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   579
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   580
	isMatchString ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   581
	    addIt := searchName match:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   582
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   583
	    addIt := aGlobalName startsWith:searchName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   584
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   585
	addIt ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   586
	    matches add:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   587
	] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   588
	    "/ try ignoring case
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   589
	    isMatchString ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   590
		addIt := searchName match:aGlobalName caseSensitive:false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   591
	    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   592
		addIt := aGlobalName asLowercase startsWith:searchName asLowercase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   593
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   594
	    addIt ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   595
		ignCaseMatches add:aGlobalName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   596
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   597
	]
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   598
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   599
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   600
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   601
	matches := ignCaseMatches
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   602
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   603
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   604
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   605
	^ 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
   606
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   607
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   608
	^ 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
   609
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   610
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   611
    isMatchString ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   612
	best := searchName.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   613
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   614
	best := matches longestCommonPrefix.
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   615
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   616
    ^ 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
   617
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   618
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   619
     Smalltalk globalnameCompletion:'Arr'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   620
     Smalltalk globalnameCompletion:'Arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   621
     Smalltalk globalnameCompletion:'arra'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   622
     Smalltalk globalnameCompletion:'*rray'
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   623
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   624
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   625
    "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
   626
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   627
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   628
methodProtocolCompletion:aPartialProtocolName inEnvironment:anEnvironment
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   629
    "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
   630
     2 entries: 1st: the best (longest) match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   631
		2nd: collection consisting of matching protocols"
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   632
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   633
    |matches best lcName|
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   634
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   635
    matches := IdentitySet new.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   636
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   637
    "/ search for exact match
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   638
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   639
	|protocol|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   640
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   641
	protocol := eachMethod category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   642
	(protocol notNil and:[protocol startsWith:aPartialProtocolName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   643
	    matches add:protocol
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   644
	].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   645
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   646
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   647
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   648
	lcName := aPartialProtocolName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   649
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   650
	    |protocol|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   651
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   652
	    protocol := eachMethod category.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   653
	    (protocol notNil and:[protocol asLowercase startsWith:lcName]) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   654
		matches add:protocol
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   655
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   656
	].
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   657
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   658
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   659
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   660
	^ Array with:aPartialProtocolName with:(Array with:aPartialProtocolName)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   661
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   662
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   663
	^ Array with:matches first with:(matches asArray)
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   664
    ].
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   665
    matches := matches asSortedCollection.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   666
    best := matches longestCommonPrefix.
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   667
    ^ Array with:best with:matches asArray
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   668
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   669
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   670
     Smalltalk methodProtocolCompletion:'doc'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   671
     Smalltalk methodProtocolCompletion:'docu'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   672
     Smalltalk methodProtocolCompletion:'documenta'
4051
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   673
    "
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   674
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   675
    "Created: / 10-08-2006 / 13:05:27 / cg"
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   676
    "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
   677
!
fe8801e391cd moved extensions to base
Claus Gittinger <cg@exept.de>
parents: 4050
diff changeset
   678
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   679
nameSpaceCompletion:aPartialClassName inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   680
    "given a partial name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   681
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   682
		2nd: collection consisting of matching names"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   683
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   684
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   685
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   686
	filter:[:cls | cls isNameSpace]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   687
	inEnvironment:anEnvironment
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   688
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   689
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   690
     DoWhatIMeanSupport nameSpaceCompletion:'To'  inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   691
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   692
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   693
    "Created: / 10-08-2006 / 13:02:16 / cg"
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   694
!
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   695
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   696
packageCompletion:aPartialPackage inEnvironment:anEnvironment
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   697
    "given a partial package name, return an array consisting of
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   698
     2 entries: 1st: the best (longest) match
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   699
                2nd: collection consisting of matching packages"
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   700
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   701
    |matches best lcName|
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   702
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   703
    matches := Smalltalk allPackageIDs
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   704
        select:[:package | package startsWith:aPartialPackage].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   705
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   706
    matches isEmpty ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   707
        "/ search for case-ignoring match
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   708
        lcName := aPartialPackage asLowercase.
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   709
        anEnvironment allClassesDo:[:aClass |
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   710
            |package|
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   711
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   712
            package := aClass package.
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   713
            (package notNil and:[package asLowercase startsWith:lcName]) ifTrue:[
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   714
                matches add:package
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   715
            ].
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   716
        ].
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   717
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   718
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   719
    matches isEmpty ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   720
        ^ Array with:aPartialPackage with:(Array with:aPartialPackage)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   721
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   722
    matches size == 1 ifTrue:[
4976
2e6c19f32c49 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4954
diff changeset
   723
        ^ Array with:matches first with:(matches asArray)
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   724
    ].
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   725
    matches := matches asSortedCollection.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   726
    best := matches longestCommonPrefix.
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   727
    ^ Array with:best with:matches asArray
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   728
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   729
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   730
     DoWhatIMeanSupport packageCompletion:'stx:' inEnvironment:Smalltalk
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   731
     DoWhatIMeanSupport packageCompletion:'stx:libw' inEnvironment:Smalltalk
2975
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   732
    "
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   733
300462273a16 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2830
diff changeset
   734
    "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
   735
!
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   736
2977
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   737
packageNameEntryCompletionBlock
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   738
    "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
   739
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   740
    ^ self entryCompletionBlockFor:#'packageCompletion:inEnvironment:'
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   741
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   742
    "Created: / 10-08-2006 / 13:22:31 / cg"
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   743
!
3e4b5adccfd6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2975
diff changeset
   744
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   745
poolnameCompletion:aPartialClassName inEnvironment:anEnvironment
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   746
    "given a partial poolname, return an array consisting of
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   747
     2 entries: 1st: the best (longest) match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   748
		2nd: collection consisting of matching names"
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   749
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   750
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   751
	classnameCompletion:aPartialClassName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   752
	filter:[:cls | cls isSharedPool]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   753
	inEnvironment:anEnvironment
4148
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   754
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   755
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   756
     self poolnameCompletion:'Win' inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   757
     self poolnameCompletion:'Z'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   758
     self poolnameCompletion:'a'   inEnvironment:Smalltalk
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   759
    "
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   760
!
b314d59c1654 added: #poolnameCompletion:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 4146
diff changeset
   761
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   762
resourceCompletion:aPartialResourceName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   763
    "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
   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 defined resources"
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   766
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   767
    |matches best lcSym isMatch|
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   768
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   769
    matches := IdentitySet new.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   770
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   771
    isMatch := doMatch and:[aPartialResourceName includesMatchCharacters].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   772
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   773
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   774
	eachMethod hasResource ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   775
	    eachMethod resources keysDo:[:eachResourceName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   776
		(isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   777
		    ifTrue:[ (aPartialResourceName match:eachResourceName caseSensitive:ignoreCase not) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   778
		    ifFalse:[ ignoreCase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   779
				ifTrue:[ (eachResourceName asLowercase startsWith:aPartialResourceName asLowercase) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   780
				ifFalse:[ (eachResourceName startsWith:aPartialResourceName) ] ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   781
		) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   782
		    matches add:eachResourceName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   783
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   784
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   785
	].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   786
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   787
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   788
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   789
	lcSym := aPartialResourceName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   790
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   791
	    eachMethod hasResource ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   792
		eachMethod resources keysDo:[:eachResourceName |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   793
		    (isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   794
			ifTrue:[ (aPartialResourceName match:eachResourceName caseSensitive:false) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   795
			ifFalse:[ (eachResourceName asLowercase startsWith:lcSym) ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   796
		     ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   797
			matches add:eachResourceName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   798
		    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   799
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   800
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   801
	].
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   802
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   803
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   804
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   805
	^ Array with:aPartialResourceName with:#()
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   806
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   807
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   808
	^ Array with:matches first with:(matches asArray)
4049
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   809
    ].
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   810
    matches := matches asSortedCollection.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   811
    best := matches longestCommonPrefix.
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   812
    ^ Array with:best with:matches asArray
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   813
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   814
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   815
     DoWhatIMeanSupport resourceCompletion:'*debug*' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   816
     DoWhatIMeanSupport resourceCompletion:'context' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   817
     DoWhatIMeanSupport resourceCompletion:'key' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   818
     DoWhatIMeanSupport resourceCompletion:'cont' inEnvironment:Smalltalk match:true ignoreCase:false
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   819
    "
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   820
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   821
    "Created: / 06-07-2011 / 12:04:41 / cg"
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   822
!
b5540a857436 added: #resourceCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 4047
diff changeset
   823
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   824
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   825
    "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
   826
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   827
		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
   828
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   829
    ^ self selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:false
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   830
!
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   831
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   832
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   833
    "given a partial selector, return an array consisting of
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   834
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   835
		2nd: collection consisting of matching implemented selectors"
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
    ^ self
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   838
	selectorCompletion:aPartialSymbolName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   839
	inEnvironment:anEnvironment
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   840
	match:doMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   841
	ignoreCase:false
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   842
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   843
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   844
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   845
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   846
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   847
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   848
     DoWhatIMeanSupport selectorCompletion:'nextp' inEnvironment:Smalltalk match:true
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   849
    "
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   850
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   851
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   852
    "Modified: / 26-10-2010 / 20:30:27 / cg"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   853
!
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   854
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   855
selectorCompletion:aPartialSymbolName inEnvironment:anEnvironment match:doMatch ignoreCase:ignoreCase
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   856
    "given a partial selector, return an array consisting of
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   857
     2 entries: 1st: the longest match
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   858
		2nd: collection consisting of matching implemented selectors"
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   859
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   860
    |matches best lcSym isMatch|
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   861
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   862
    matches := IdentitySet new.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   863
3863
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   864
    isMatch := doMatch and:[aPartialSymbolName includesMatchCharacters].
Claus Gittinger <cg@exept.de>
parents: 3854
diff changeset
   865
3751
eafbe64ab0fc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3734
diff changeset
   866
    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   867
	(isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   868
	    ifTrue:[ (aPartialSymbolName match:eachSelector caseSensitive:ignoreCase not) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   869
	    ifFalse:[ ignoreCase
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   870
			ifTrue:[ (eachSelector asLowercase startsWith:aPartialSymbolName asLowercase) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   871
			ifFalse:[ (eachSelector startsWith:aPartialSymbolName) ] ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   872
	 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   873
	    matches add:eachSelector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   874
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   875
    ].
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   876
    (matches isEmpty and:[ignoreCase not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   877
	"/ search for case-ignoring match
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   878
	lcSym := aPartialSymbolName asLowercase.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   879
	anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   880
	    (isMatch
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   881
		ifTrue:[ (aPartialSymbolName match:eachSelector caseSensitive:false) ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   882
		ifFalse:[ (eachSelector asLowercase startsWith:lcSym) ])
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   883
	     ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   884
		matches add:eachSelector
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   885
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   886
	].
2661
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   887
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   888
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   889
    matches isEmpty ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   890
	^ 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
   891
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   892
    matches size == 1 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   893
	^ 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
   894
    ].
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   895
    matches := matches asSortedCollection.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   896
    best := matches longestCommonPrefix.
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   897
    ^ 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
   898
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   899
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   900
     DoWhatIMeanSupport selectorCompletion:'inst*p' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   901
     DoWhatIMeanSupport selectorCompletion:'inst*pl' inEnvironment:Smalltalk match:true
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
   902
     DoWhatIMeanSupport selectorCompletion:'at:p' inEnvironment:Smalltalk match:true
3867
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   903
     DoWhatIMeanSupport selectorCompletion:'nextP' inEnvironment:Smalltalk match:true
03f7ad841731 changed: #selectorCompletion:inEnvironment:match:
Claus Gittinger <cg@exept.de>
parents: 3864
diff changeset
   904
     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
   905
    "
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   906
3955
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   907
    "Modified: / 07-06-1996 / 08:44:33 / stefan"
94fb4a47d108 added: #selectorCompletion:inEnvironment:match:ignoreCase:
Claus Gittinger <cg@exept.de>
parents: 3929
diff changeset
   908
    "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
   909
! !
f68913f2facf moved all input completion methods from Smalltalk to here.
Claus Gittinger <cg@exept.de>
parents: 2560
diff changeset
   910
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   911
!DoWhatIMeanSupport class methodsFor:'rename support'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   912
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   913
goodRenameDefaultFor:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   914
    "generate a reasonable default for a rename operation.
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
   915
     (used for rename category etc.)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
   916
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
   917
    |prefix suffix lastNewSize lastOldSize left right inserted deleted tryAgain|
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   918
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   919
    lastNewName isNil ifTrue:[ ^ nil].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   920
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   921
    lastNewSize := lastNewName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   922
    lastOldSize := lastOldName size.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   923
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   924
    (lastNewName endsWith:lastOldName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   925
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   926
            'foo' -> 'Xfoo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   927
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   928
            'bar' would be 'Xbar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   929
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   930
        prefix := lastNewName copyTo:(lastNewSize - lastOldSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   931
        ^ (prefix , oldName).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   932
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   933
    (lastOldName endsWith:lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   934
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   935
            'Xfoo' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   936
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   937
            'Xbar' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   938
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   939
        prefix := lastOldName copyTo:(lastOldSize - lastNewSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   940
        (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   941
            ^ (oldName copyFrom:prefix size+1).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   942
        ]
2514
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   943
    ].
4f8d8658289a comments
Claus Gittinger <cg@exept.de>
parents: 2513
diff changeset
   944
    (lastOldName asLowercase = lastNewName asLowercase) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   945
        (lastOldName first ~= lastNewName first) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   946
            (lastOldName first isLowercase = oldName first isLowercase) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   947
                "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   948
                    'xfoo' -> 'Xfoo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   949
                 then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   950
                    'xbar' would be 'Xbar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   951
                "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   952
                lastOldName first isLowercase ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   953
                    ^ oldName asUppercaseFirst "oldName first asUppercase asString , (oldName copyFrom:2)".
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   954
                ] ifFalse:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   955
                    ^ oldName asLowercaseFirst "oldName first asLowercase asString , (oldName copyFrom:2)".
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   956
                ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   957
            ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   958
        ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   959
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   960
    (lastOldName withoutSeparators = lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   961
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   962
            '  foo   ' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   963
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   964
            '  bar   ' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   965
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   966
        ^ oldName withoutSeparators.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   967
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   968
    (lastNewName startsWith:lastOldName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   969
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   970
            'foo' -> 'fooX'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   971
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   972
            'bar' would be 'barX'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   973
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   974
        suffix := lastNewName copyLast:(lastNewSize - lastOldSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   975
        ^ (oldName , suffix).
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   976
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   977
    (lastOldName startsWith:lastNewName) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   978
        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   979
            'fooX' -> 'foo'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   980
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   981
            'barX' would be 'bar'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   982
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   983
        suffix := lastOldName copyLast:(lastOldSize - lastNewSize).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   984
        (oldName endsWith:suffix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   985
            ^ (oldName copyButLast:suffix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   986
        ]
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   987
    ].
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   988
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   989
    prefix := lastOldName commonPrefixWith:lastNewName.
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
   990
    suffix := lastOldName commonSuffixWith:lastNewName.
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
   991
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
   992
    (prefix size > 0) ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   993
        (suffix size > 0) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   994
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   995
            prefix := prefix copyTo:(((lastNewName size - suffix size) min:(lastOldName size - suffix size)) min:prefix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   996
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   997
            "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   998
                'fooR' -> 'fooXR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
   999
             then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1000
                'barR' would be 'barXR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1001
            "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1002
            left := lastOldName copyTo:prefix size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1003
            right := lastOldName copyLast:suffix size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1004
            lastNewSize > lastOldSize ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1005
                inserted := (lastNewName copyFrom:(left size + 1)) copyButLast:(right size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1006
                inserted size > 0 ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1007
                    (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1008
                        ^ oldName copyWithAll:inserted insertedAfterIndex:prefix size
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1009
                    ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1010
                ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1011
            ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1012
            (oldName string endsWith:suffix string) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1013
                deleted := (lastOldName string copyFrom:(prefix size + 1)) copyButLast:(suffix size).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1014
                (oldName size-suffix size-deleted size + 1) >= 1 ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1015
                    ((oldName copyFrom:oldName size-suffix size-deleted size + 1) copyTo:deleted size) = deleted ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1016
                        "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1017
                            'fooXR' -> 'fooR'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1018
                         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1019
                            'barXS' would be 'barS'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1020
                        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1021
                        ^ (oldName copyTo:oldName size-suffix size-deleted size) , suffix
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1022
                    ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1023
                ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1024
            ]
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1025
        ].
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1026
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1027
        (oldName endsWith:(lastOldName copyFrom:prefix size+1)) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1028
            "last rename was
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1029
                'fooX' -> 'fooY'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1030
             then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1031
                'barX' would be 'barY'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1032
            "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1033
            left := oldName copyButLast:(lastOldName copyFrom:prefix size+1) size.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1034
            right := lastNewName copyFrom:prefix size+1.
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1035
            ^ left , right
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1036
        ]
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1037
    ].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1038
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1039
    suffix size > 0 ifTrue:[
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1040
        |prefix2|
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1041
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1042
        "last rename was:
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1043
            'fooSUFF1' -> 'barSUFF1'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1044
         then, a good default for
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1045
            'fooSUFF2' -> 'barSUFF2'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1046
        "
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1047
        prefix := lastOldName copyTo:(lastOldName size - suffix size).  "/ the foo
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1048
        (oldName startsWith:prefix) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1049
            prefix2 := lastNewName copyTo:(lastNewName size - suffix size). "/ the bar
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1050
            ^ prefix2,(oldName copyFrom:(prefix size+1)).
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1051
        ].
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1052
    ].
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1053
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1054
    "/ was there something stripped at the end?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1055
    suffix := oldName commonSuffixWith:lastOldName.
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1056
    (suffix size > 0) ifTrue:[
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1057
        ^ self
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1058
            goodRenameDefaultFor:(oldName copyButLast:suffix size)
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1059
            lastOld:(lastOldName copyButLast:suffix size)
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1060
            lastNew:lastNewName.
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1061
    ].
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1062
    ^ nil
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1063
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1064
    "
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1065
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fooXX'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1066
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'XXfoo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1067
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1068
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'foo'
2558
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1069
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
81ef3253fd23 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2557
diff changeset
  1070
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1071
     self goodRenameDefaultFor:'barXX' lastOld:'fooXX' lastNew:'fooYY'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1072
     self goodRenameDefaultFor:'XXbar' lastOld:'XXfoo' lastNew:'foo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1073
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1074
     self goodRenameDefaultFor:'bar2' lastOld:'foo1' lastNew:'foo01'
2559
f9f489baf23f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2558
diff changeset
  1075
     self goodRenameDefaultFor:'barXY' lastOld:'fooXY' lastNew:'fooY'
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1076
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1077
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'fXXXoo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1078
     self goodRenameDefaultFor:'bar' lastOld:'foo' lastNew:'foXXXo'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1079
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1080
     self goodRenameDefaultFor:'bar001' lastOld:'foo001' lastNew:'foo002_001'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1081
     self goodRenameDefaultFor:'CoastCore-CSFoo' lastOld:'CoastCore-CSBar' lastNew:'Coast-Core-CSBar'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1082
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1083
     self goodRenameDefaultFor:'mti.odt2.level1HeadlineStyle'
5143
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1084
                       lastOld:'mti.odt2.level1HeadlineMatchPattern'
0162f8ec658a #OTHER by mawalch
mawalch
parents: 5133
diff changeset
  1085
                       lastNew:'Key_odt2_level1HeadlineMatchPattern'
2557
b1d8a61319d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2553
diff changeset
  1086
    "
4065
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1087
ebea28fa8bab changed: #goodRenameDefaultFor:lastOld:lastNew:
Claus Gittinger <cg@exept.de>
parents: 4058
diff changeset
  1088
    "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
  1089
!
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1090
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1091
goodRenameDefaultForFile:oldName lastOld:lastOldName lastNew:lastNewName
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
  1092
    "generate a reasonable default for a file rename operation.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1093
     (Try to rename multiple files in the new fileBrowser,
2513
de7a2f5335c2 comments
Claus Gittinger <cg@exept.de>
parents: 2468
diff changeset
  1094
     to see what this is doing)"
2468
beeedb5f57f4 comment
Claus Gittinger <cg@exept.de>
parents: 2434
diff changeset
  1095
2382
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1096
    |prefix suffix t
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1097
     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
  1098
     lastRemoved lastInserted default|
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1099
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1100
    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
  1101
    default notNil ifTrue:[ ^ default].
d89d86edaae4 separated default for arbitrary renames and deault for files.
Claus Gittinger <cg@exept.de>
parents: 2376
diff changeset
  1102
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1103
    lastOldWOSuffix := lastOldName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1104
    lastNewWOSuffix := lastNewName asFilename nameWithoutSuffix.
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1105
    oldWOSuffix := oldName asFilename nameWithoutSuffix.
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1106
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1107
    "/ suffix change ?
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1108
    lastOldWOSuffix = lastNewWOSuffix ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1109
	lastOldName asFilename suffix ~= lastNewName asFilename suffix ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1110
	    ^ (oldName asFilename withSuffix:(lastNewName asFilename suffix)) pathName
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1111
	].
2434
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1112
    ].
e7758915432e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2382
diff changeset
  1113
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1114
    default := self goodRenameDefaultFor:oldWOSuffix lastOld:lastOldWOSuffix lastNew:lastNewWOSuffix.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1115
    default notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1116
	lastOldRest := lastOldName copyFrom:lastOldWOSuffix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1117
	lastNewRest := lastNewName copyFrom:lastNewWOSuffix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1118
	oldRest := oldName copyFrom:oldWOSuffix size + 1.
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
	^ default , lastNewRest
2553
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1121
    ].
9925f0aca022 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2517
diff changeset
  1122
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1123
    prefix := lastOldWOSuffix commonPrefixWith:oldWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1124
    (lastNewWOSuffix startsWith:prefix) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1125
	lastOldRest := lastOldWOSuffix copyFrom:prefix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1126
	lastNewRest := lastNewWOSuffix copyFrom:prefix size + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1127
	oldRest := oldWOSuffix copyFrom:prefix size + 1.
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
	(lastNewRest endsWith:lastOldRest) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1130
	    t := lastNewRest copyButLast:lastOldRest size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1131
	    ^ ((prefix , t , oldRest) asFilename withSuffix:oldName asFilename suffix) name
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1132
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1133
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1134
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1135
    suffix := lastOldWOSuffix commonSuffixWith:lastNewWOSuffix.
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1136
    suffix size > 0 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1137
	"/ last change changed something at the beginning
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1138
	prefix := oldWOSuffix commonPrefixWith:lastOldWOSuffix.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1139
	prefix size > 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1140
	    "/ this name starts with the same characters
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1141
	    lastRemoved := lastOldWOSuffix copyButLast:suffix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1142
	    lastInserted := lastNewWOSuffix copyButLast:suffix size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1143
	    (lastRemoved startsWith:lastInserted) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1144
		oldWOSuffix size >= lastInserted size ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1145
		    ^ (oldWOSuffix copyTo:lastInserted size) , (oldName copyFrom:lastRemoved size + 1)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1146
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1147
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1148
	    ^ lastInserted , (oldName copyFrom:lastRemoved size + 1)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1149
	].
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1150
    ].
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1151
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1152
    ^ nil
3135
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1153
7ad9ff29225e changed #classCategoryLoadFromRepository
Claus Gittinger <cg@exept.de>
parents: 2977
diff changeset
  1154
    "Modified: / 07-11-2006 / 13:58:39 / cg"
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1155
! !
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1156
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1157
!DoWhatIMeanSupport class methodsFor:'typing distance'!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1158
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1159
isKey:k1 nextTo:k2
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1160
    "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
  1161
     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
  1162
     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
  1163
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1164
    ^ 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
  1165
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1166
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1167
     self isKey:$a nextTo:$a
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1168
     self isKey:$a nextTo:$s
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1169
     self isKey:$a nextTo:$q
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1170
     self isKey:$a nextTo:$w
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1171
     self isKey:$a nextTo:$z
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1172
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1173
    "
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1174
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1175
    "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
  1176
!
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1177
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1178
isKey:k1 nextTo:k2 onKeyboard:keys
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1179
    "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
  1180
     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
  1181
     (typo checker uses a modified levenshtein, 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1182
      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
  1183
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1184
    |row1 row2 col1 col2|
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1185
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1186
    row1 := keys findFirst:[:eachRow | col1 := eachRow indexOf:k1. col1 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1187
    row1 == 0 ifTrue:[^ false].
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1188
    row2 := keys findFirst:[:eachRow | col2 := eachRow indexOf:k2. col2 ~~ 0].
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1189
    row2 == 0 ifTrue:[^ false].
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1190
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1191
    ^ (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
  1192
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1193
    "
2774
82e1d84243f4 comment
Stefan Vogel <sv@exept.de>
parents: 2667
diff changeset
  1194
     self isKey:$a nextTo:$q
2517
a5323c17b767 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2516
diff changeset
  1195
     self isKey:$a nextTo:$x
2515
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1196
    "
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1197
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1198
    "Modified (comment): / 01-05-2016 / 12:19:24 / cg"
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1199
!
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1200
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1201
keyboard
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1202
    "the keyboard layout
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1203
     (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
  1204
     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
  1205
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1206
    |lang|
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1207
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1208
    lang := UserPreferences current language.
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1209
    lang == #de ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1210
	^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1211
	       '1234567890-'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1212
	       '*qwertzuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1213
	       '**asdfghjkl:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1214
	       '***yxcvbnm'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1215
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1216
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1217
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1218
    lang == #fr ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1219
	^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1220
	       '1234567890'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1221
	       '*azertyuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1222
	       '**qsdfghjklm'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1223
	       '***wxcvbn,'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1224
	).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1225
    ].
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1226
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1227
    ^ #(
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1228
	   '1234567890-'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1229
	   '*qwertyuiop'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1230
	   '**asdfghjkl:'
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1231
	   '***zxcvbnm'
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  1232
    ).
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1233
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1234
    "
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1235
     self keyboard
3316
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1236
    "
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1237
745c8130b3a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3310
diff changeset
  1238
    "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
  1239
! !
69cbb89c127e +isKey:nextTo: for simple typo detection
Claus Gittinger <cg@exept.de>
parents: 2514
diff changeset
  1240
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1241
!DoWhatIMeanSupport methodsFor:'code completion'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1242
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1243
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
  1244
    "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
  1245
     (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
  1246
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1247
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1248
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1249
        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
  1250
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1251
           (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
  1252
     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
  1253
     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
  1254
     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
  1255
     perform the completion.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1256
     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
  1257
     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
  1258
     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
  1259
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1260
     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
  1261
     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
  1262
     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
  1263
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1264
    | language |
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1265
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1266
    codeAspect := codeAspectArg.
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1267
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1268
    languageOrNilArg notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1269
        language := languageOrNilArg
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1270
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1271
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1272
            | method |
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1273
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1274
            method := contextOrNilArg method.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1275
            method notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1276
                language := method programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1277
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1278
                contextOrNilArg isJavaContext ifTrue:[
4845
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  1279
                    language := (Smalltalk at:#JavaLanguage) instance
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1280
                ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1281
                    language := SmalltalkLanguage instance.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1282
                ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1283
            ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1284
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1285
            methodOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1286
                language := methodOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1287
            ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1288
                classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1289
                    language := classOrNilArg programmingLanguage
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1290
                ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1291
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1292
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1293
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1294
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1295
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1296
        language isSmalltalk ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1297
            ^self codeCompletionForSmalltalkMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1298
        ].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1299
        language isSTXJavaScript ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1300
            ^self codeCompletionForJavascriptMethod: methodOrNilArg orClass: classOrNilArg context: contextOrNilArg codeView: codeViewArg into: actionBlock
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1301
        ].
4426
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1302
    ].
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1303
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1304
    "/ No completion support for given language
5051
6e150dbaf9bc #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 5050
diff changeset
  1305
    "/ 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
  1306
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1307
    "Created: / 27-09-2013 / 10:21:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4845
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  1308
    "Modified: / 25-09-2015 / 07:36:13 / 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
  1309
!
76a0c105e8f4 Updated to take codeAspect as an argument for completion.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4423
diff changeset
  1310
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1311
codeCompletionForLanguage: languageOrNil class: classOrNilArg context:contextOrNilArg codeView:codeViewArg
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1312
    "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
  1313
     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
  1314
     nil, if called from the browser.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1315
     If nonNil, we can make better guesses, 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1316
     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
  1317
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1318
    | language |
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1319
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1320
    languageOrNil notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1321
        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
  1322
    ] ifFalse:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1323
        contextOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1324
            language := contextOrNilArg method programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1325
        ] ifFalse:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1326
            classOrNilArg notNil ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1327
                language := classOrNilArg programmingLanguage.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1328
            ]
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1329
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1330
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1331
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1332
    language notNil ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1333
        language isSmalltalk ifTrue:[
4731
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1334
            classOrNil := classOrNilArg.
145b177a3203 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4727
diff changeset
  1335
            contextOrNil := contextOrNilArg.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1336
            ^self codeCompletionForSmalltalkClass: classOrNil context: contextOrNil codeView: codeViewArg
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1337
        ].
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1338
    ].
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1339
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1340
    "/ 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
  1341
    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
  1342
    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
  1343
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1344
    "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
  1345
!
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1346
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1347
setClass: classOrNilArg andContext:contextOrNilArg
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1348
    classOrNil := classOrNilArg.
045024ffa956 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4976
diff changeset
  1349
    contextOrNil := contextOrNilArg.
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1350
!
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1351
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1352
setSelf: instanceOrNilArg 
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  1353
    instanceOrNil := instanceOrNilArg.
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1354
! !
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1355
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1356
!DoWhatIMeanSupport methodsFor:'code completion - JavaScript'!
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1357
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1358
codeCompletionForJavascriptMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1359
    "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
  1360
     (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
  1361
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1362
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1363
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1364
        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
  1365
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1366
           (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
  1367
     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
  1368
     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
  1369
     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
  1370
     perform the completion.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1371
     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
  1372
     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
  1373
     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
  1374
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1375
     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
  1376
     or nil, if called from the browser.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1377
     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
  1378
4845
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  1379
    languageOrNil := (Smalltalk at:#STXJavaScriptLanguage) instance.
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1380
    methodOrNil := methodOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1381
    classOrNil := classOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1382
    codeView := codeViewArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1383
    contextOrNil := contextOrNilArg.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1384
4845
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  1385
    (Smalltalk at:#STXJavaScriptLanguage) notNil ifTrue:[
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  1386
        (Smalltalk at:#STXJavaScriptLanguage) new
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1387
           completeForMethod: methodOrNil class: classOrNil context: contextOrNil codeView: codeView into: actionBlock.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1388
    ].
4423
c21baefab5d0 Call to JavaScriptCompletionEngine when completing for JS
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4422
diff changeset
  1389
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1390
    self information:'Not yet supported'.
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1391
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1392
    "Created: / 18-09-2013 / 16:24:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4845
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  1393
    "Modified: / 25-09-2015 / 07:37:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1394
! !
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1395
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1396
!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
  1397
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1398
codeCompletionForSmalltalkClass: classOrNilArg context:contextOrNilArg codeView:codeViewArg
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1399
4379
f79671ee6211 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4378
diff changeset
  1400
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1401
     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
  1402
     nil, if called from the browser.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1403
     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
  1404
     This is not yet done, sigh"
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1405
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1406
    |crsrPos char interval source node parent checkedNode instanceOrNilArg
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1407
     forceNewMessageSend classOfReceiver prevChar|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1408
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1409
    languageOrNil := SmalltalkLanguage instance.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1410
    classOrNil := classOrNilArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1411
    codeView := codeViewArg.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1412
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1413
    crsrPos := codeView characterPositionOfCursor"-1".
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1414
    char := codeView characterAtCharacterPosition:crsrPos.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1415
    "/ Transcript show:crsrPos; show:' '; showCR:char.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1416
    [crsrPos > 1 and:[char isSeparator or:['.' includes:char]]] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1417
        crsrPos := crsrPos - 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1418
        char := codeView characterAtCharacterPosition:crsrPos.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1419
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1420
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1421
    interval := codeView selectedInterval.
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  1422
    "/ Transcript show:'iv: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1423
    interval isEmpty ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1424
        interval := crsrPos"-1" to:crsrPos.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1425
        "/ Transcript show:'iv2: '; showCR:interval.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1426
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1427
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1428
    source := codeView contentsAsString string.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1429
    source := source copyTo:crsrPos.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1430
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1431
    "/ this is too naive and stupid; if there is a syntactic error,
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1432
    "/ 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
  1433
    "/ 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
  1434
    "/ without any progress.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1435
    "/ 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
  1436
    "/ as it parses the code. Stop, when the interval is hit.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1437
    "/ that will also work for syntactic incorrect source code.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1438
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1439
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1440
        "/ Transcript show:'nd1: '; showCR:node.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1441
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1442
    node isNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1443
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1444
        "/ Transcript show:'nd2 try: '; showCR:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1445
        node isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1446
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1447
            self breakPoint:#cg.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1448
            "/ self information:'No parseNode found (syntax error before or in comment?)'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1449
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1450
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1451
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1452
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1453
    forceNewMessageSend := false.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1454
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1455
    "/ 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
  1456
    prevChar := codeView characterBeforeCursor.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1457
    (prevChar isSeparator or:[ ')}]''' includes:prevChar ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1458
        (node isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1459
            and:[ (parent := node parent) notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1460
            and:[ parent isMessage ]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1461
        ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1462
            "/ completion after a variable node...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1463
            parent isKeyword ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1464
                "/ and it is a keyword message, we complete the keyword message instead
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1465
                node := parent.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1466
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1467
                "/ 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
  1468
                "/ (however, no character is available to determine what is useful)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1469
                forceNewMessageSend := true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1470
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1471
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1472
            (node isMessage and:[node isUnary]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1473
                "/ expanding <rcvr> foo |<- cursor here (i.e. a space after foo)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1474
                "/
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1475
                forceNewMessageSend := true.
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1476
"/                "/ can we see what we get from foo?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1477
"/                classOfReceiver := self
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1478
"/                                    classOfReceiver:node receiver
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1479
"/                                    inClass:classOrNil instance:instanceOrNil context:contextOrNil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1480
"/                classOfReceiver notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1481
"/                    |mthd|
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1482
"/
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1483
"/                    mthd := classOfReceiver lookupMethodFor:node selector.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1484
"/                    mthd notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1485
"/                        self halt.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1486
"/                        (ParseTreeSearcher isDefinitelyGetterMethod:mthd) ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1487
"/                            forceNewMessageSend := true.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1488
"/                        ]
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1489
"/                    ]
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1490
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1491
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1492
        ]
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1493
    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1494
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1495
    forceNewMessageSend ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1496
        "/ completion with nothing to start (right after a variable)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1497
        "/ 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
  1498
        classOfReceiver := self classOfNode:node.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1499
        classOfReceiver isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1500
            "/ 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
  1501
            "/ will be...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1502
            Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1503
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1504
            |superClass possible choice|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1505
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1506
            possible := classOfReceiver selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1507
            superClass := classOfReceiver superclass.
4938
bedac0cfaf04 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4936
diff changeset
  1508
            [superClass notNil "and:[(possible size + superClass selectors size) < 500]"] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1509
                possible := possible,superClass selectors.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1510
                superClass := superClass superclass.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1511
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1512
            possible := possible copy sort.
4938
bedac0cfaf04 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4936
diff changeset
  1513
            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
  1514
            choice isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1515
                Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1516
                ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1517
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1518
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1519
            codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1520
                undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1521
                    codeView insertStringAtCursor:choice
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1522
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1523
                info:'Completion'.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1524
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1525
        ^ self
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1526
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1527
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1528
    node isVariable ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1529
        self codeCompletionForVariable:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1530
        ^ self.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1531
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1532
    node isLiteral ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1533
        node value isSymbol ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1534
            self codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1535
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1536
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1537
        ^ self "/ huh - strings or what?
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1538
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1539
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1540
    checkedNode := node.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1541
    [checkedNode notNil] whileTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1542
        checkedNode isMessage ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1543
            "/ completion in a message-send
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1544
            contextOrNilArg notNil ifTrue:[
4329
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1545
"/                |rcvrNode idx rcvr val|
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1546
"/
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1547
"/                (rcvrNode := checkedNode receiver) isVariable ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1548
"/                    rcvrNode isSelf ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1549
"/                        classOrNil := contextOrNil receiver class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1550
"/                    ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1551
"/                        (idx := contextOrNil argAndVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1552
"/                            val := contextOrNil argsAndVars at:idx.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1553
"/                            classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1554
"/                        ] ifFalse:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1555
"/                            (idx := contextOrNil receiver class allInstVarNames indexOf:rcvrNode name) ~~ 0 ifTrue:[
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1556
"/                                val := contextOrNil receiver instVarNamed:rcvrNode name.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1557
"/                                classOrNil := val class.
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1558
"/                            ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1559
"/                        ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1560
"/                    ]
2150d2f0b794 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4328
diff changeset
  1561
"/                ].
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1562
                instanceOrNilArg := contextOrNilArg receiver
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1563
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1564
            self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1565
                codeCompletionForMessage:checkedNode
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1566
                inClass:classOrNil instance:instanceOrNilArg
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1567
                context:contextOrNilArg codeView:codeView.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1568
            ^ self
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1569
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1570
        checkedNode isMethod ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1571
            "/ completion in a method's selector pattern
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1572
            self codeCompletionForMethodSpec:checkedNode.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1573
            ^ self.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1574
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  1575
        checkedNode := checkedNode parent.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1576
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1577
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1578
    self information:'Node is neither variable nor message.'.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1579
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1580
    "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
  1581
!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1582
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1583
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
  1584
    "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
  1585
     (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
  1586
     the info as argument. 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1587
     The interface has been defined in that way 
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1588
     (and tight coupling with internals of the editor) because
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1589
        1) the completer needs to know about the text around the cursor position
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1590
        2) the edit operation for completion may be non-trivial
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1591
           (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
  1592
     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
  1593
     or adding another keyword part after the cursor is possible.
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1594
     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
  1595
     to perform the completion.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1596
     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
  1597
     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
  1598
     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
  1599
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1600
     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
  1601
     or nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1602
     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
  1603
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1604
    |crsrPos char interval i source partialSource cursorLineSource
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1605
     suggestions actions title suggestionCollector|
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1606
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  1607
    languageOrNil := SmalltalkLanguage instance.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1608
    methodOrNil := methodOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1609
    classOrNil := classOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1610
    codeView := codeViewArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1611
    contextOrNil := contextOrNilArg.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1612
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1613
"/    classOrNil isNil ifTrue:[
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1614
"/        self information:'No class'.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1615
"/        ^ self.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1616
"/    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1617
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1618
    crsrPos := codeView characterPositionOfCursor.
4592
ba8cb2c6ef61 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4591
diff changeset
  1619
    char := codeView characterAtCharacterPosition:(crsrPos-1 max:1).
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1620
    [crsrPos > 1 and:[char isSeparator "or:['.' includes:char]"]] whileTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1621
        crsrPos := crsrPos - 1.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1622
        char := codeView characterAtCharacterPosition:crsrPos.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1623
    ].
4711
1c2e635489e5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4710
diff changeset
  1624
    char == $. ifTrue:[
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1625
        "/ either at end of statement or after a character constant
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1626
        crsrPos == 1 ifTrue:[^ self].
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1627
        (codeView characterAtCharacterPosition:crsrPos-1) == $$ ifFalse:[^ self].
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1628
    ].
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1629
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1630
    suggestionCollector :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1631
        [:listOfSuggestions :listOfActionsOrBlock :titleWhenAsking |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1632
            "/ may be called multiple times!!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1633
            suggestions isNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1634
                suggestions := listOfSuggestions.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1635
                actions := listOfActionsOrBlock.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1636
                title := titleWhenAsking.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1637
            ] ifFalse:[    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1638
                suggestions := suggestions asOrderedCollection.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1639
                actions isBlock ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1640
                    actions := Array new:suggestions size withAll:actions.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1641
                ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1642
                actions := actions asOrderedCollection.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1643
                
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1644
                suggestions addAll:listOfSuggestions.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1645
                listOfActionsOrBlock isBlock ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1646
                    actions addAll:(Array new:listOfSuggestions size withAll:listOfActionsOrBlock).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1647
                ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1648
                    actions addAll:listOfActionsOrBlock.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1649
                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1650
                title := titleWhenAsking.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1651
            ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1652
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1653
        
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1654
    interval := crsrPos-1 to:crsrPos.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1655
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1656
    source := codeView contentsAsString string.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1657
    partialSource := source copyTo:crsrPos.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1658
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1659
    methodOrNilArg isNil ifTrue:[
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1660
        (partialSource endsWith:Character cr) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1661
            partialSource := partialSource copyButLast.
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1662
        ].    
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1663
        "/ first try parsing the current cursor line.
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1664
        "/ 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
  1665
        (i := partialSource lastIndexOf:Character cr) ~~ 0 ifTrue:[
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1666
            "/ because cursorPositions and node-positions are required elsewhere to be correct,
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1667
            "/ 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
  1668
            "/ 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
  1669
            "/ However, because somewhere else, we fetch characters from the codeView using the index,
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1670
            "/ we must preserve the line structure (i.e. keep crs).
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1671
            cursorLineSource := partialSource copy.
4926
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1672
            1 to:i do:[:pos | 
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1673
                (cursorLineSource at:pos) ~= Character cr ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1674
                    cursorLineSource at:pos put:Character space.
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1675
                ]
Claus Gittinger <cg@exept.de>
parents: 4823
diff changeset
  1676
            ].    
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1677
            self
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1678
                tryCodeCompletionWithSource:cursorLineSource nodeInterval:interval
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1679
                at:crsrPos mustBeExpression:true
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1680
                into:suggestionCollector.
4591
5e2aa5f1ce21 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4559
diff changeset
  1681
        ].
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1682
    ].
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1683
    
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1684
"/    suggestions isEmptyOrNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1685
"/        "/ try parsing the partial source (from beginning up to the cursor)
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1686
"/        self
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1687
"/            tryCodeCompletionWithSource:partialSource nodeInterval:interval
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1688
"/            at:crsrPos mustBeExpression:(classOrNilArg isNil and:[methodOrNilArg isNil])
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1689
"/            into:suggestionCollector.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1690
"/    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1691
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1692
    suggestions isEmptyOrNil ifTrue:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1693
        "/ try parsing the whole source
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1694
        self
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1695
            tryCodeCompletionWithSource:source nodeInterval:interval
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1696
            at:crsrPos mustBeExpression:false
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1697
            into:suggestionCollector
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1698
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1699
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1700
    suggestions isNil ifTrue:[
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1701
        "/ try parsing the partial source (from beginning up to the cursor)
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1702
        self
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1703
            tryCodeCompletionWithSource:partialSource nodeInterval:interval
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1704
            at:crsrPos mustBeExpression:(classOrNilArg isNil and:[methodOrNilArg isNil])
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  1705
            into:suggestionCollector.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1706
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1707
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1708
    suggestions isEmptyOrNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1709
        "/ nothing found
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  1710
        ^ self
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1711
    ].    
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  1712
    actionBlock value:suggestions value:actions value:title.
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1713
4392
9570ef5f05c3 Added language discrimination to code completion entry-entry proint method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4391
diff changeset
  1714
    "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
  1715
! !
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1716
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1717
!DoWhatIMeanSupport methodsFor:'code completion - obsolete'!
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1718
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1719
codeCompletionForClass:classOrNilArg context:contextOrNil codeView:codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1720
    <resource: #obsolete>
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1721
    "OBSOLETE; migrating to use the the new 'xxx: into:' protocol.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1722
     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
  1723
     nil, if called from the browser.
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1724
     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
  1725
     This is not yet done, sigh"
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1726
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1727
    ^self codeCompletionForLanguage: nil class:classOrNilArg context:contextOrNil codeView:codeViewArg
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1728
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1729
    "Modified: / 04-07-2006 / 18:48:26 / fm"
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1730
    "Modified: / 28-08-2013 / 17:15:25 / cg"
4391
903ec83fb9cd class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4390
diff changeset
  1731
    "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
  1732
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1733
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1734
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
  1735
    <resource: #obsolete>
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  1736
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1737
	codeCompletionForSmalltalkMethod:methodOrNilArg orClass:classOrNilArg context:contextOrNilArg codeView:codeViewArg into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1738
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1739
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1740
!DoWhatIMeanSupport methodsFor:'code completion-helpers'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1741
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1742
askUserForCompletion:what for:codeView at:position from:allTheBest
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1743
    |list choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1744
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1745
    "/ cg: until the new stuff works,...
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1746
    ^ self old_askUserForCompletion:what for:codeView from:allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1747
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1748
"/    allTheBest isEmpty ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1749
"/        ^ nil
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1750
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1751
"/    allTheBest size == 1 ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1752
"/        ^ allTheBest first
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1753
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1754
"/    list := allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1755
"/    LastChoices notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1756
"/        lastChoice := LastChoices at:what ifAbsent:nil.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1757
"/        lastChoice notNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1758
"/            list := { lastChoice allBold } , (list copyWithout:lastChoice).
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1759
"/        ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1760
"/    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1761
"/    choice := Tools::CodeCompletionMenu
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1762
"/                openFor:codeView
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1763
"/                at:position
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1764
"/                with:allTheBest.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1765
"/    LastChoices isNil ifTrue:[
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1766
"/        LastChoices := Dictionary new.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1767
"/    ].
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1768
"/    LastChoices at:what put:choice.
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  1769
"/    ^ choice string
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1770
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1771
    "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
  1772
    "Modified: / 28-08-2013 / 16:41:35 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1773
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1774
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1775
askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1776
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1777
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1778
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1779
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1780
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1781
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1782
    LastChoices notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1783
	lastChoice := LastChoices at:what ifAbsent:nil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1784
	lastChoice notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1785
	    list := {lastChoice. nil. } , (list copyWithout:lastChoice).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1786
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1787
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1788
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1789
    list size < 30 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1790
	|menu idx exitKey|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1791
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1792
	menu := PopUpMenu labels:list.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1793
	menu hideOnKeyFilter:[:key | |hide|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1794
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1795
		hide ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1796
		    exitKey := key.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1797
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1798
		hide].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1799
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1800
	idx := menu startUp.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1801
	idx == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1802
	    exitKey notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1803
		codeView keyPress:exitKey x:0 y:0.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1804
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1805
	    ^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1806
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1807
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1808
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1809
	resources := codeView application isNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1810
			ifTrue:[ codeView resources]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1811
			ifFalse:[ codeView application resources ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1812
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1813
	choice := Dialog
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1814
	   choose:(resources string:'Choose ',what)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1815
	   fromList:list
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1816
	   lines:20
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1817
	   title:(resources string:'Code completion').
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1818
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1819
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1820
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1821
    LastChoices isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1822
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1823
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1824
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1825
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1826
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1827
    "Created: / 10-11-2006 / 14:00:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1828
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1829
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1830
codeCompletionForBlockArgument:node into:actionBlock
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1831
!
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  1832
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1833
codeCompletionForLiteralSymbol:nodeOrNil element:tokenOrNil considerAll:considerAll into:actionBlock
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1834
    "looking for all symbols is way too much and inprecise;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1835
     experiment: only present symbols which are used by the class,
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1836
     and classes in that class category, or at least: implemented as method.
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1837
     We'll see..."
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1838
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1839
    |sym possibleCompletions longest editAction start stop addSymbol
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1840
     parentSelector parent symbolSelectorClass|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1841
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  1842
    "/ Transcript show:'lit in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1843
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1844
    start := (nodeOrNil ? tokenOrNil) start.
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1845
    stop := (nodeOrNil ? tokenOrNil) stop.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1846
    (codeView characterAtCharacterPosition:stop) == $' ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1847
        ^ self.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1848
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1849
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1850
    sym := (nodeOrNil ? tokenOrNil) value.
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1851
    possibleCompletions := Set new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1852
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1853
    addSymbol :=
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1854
        [:aSymbol |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1855
            (aSymbol startsWith:sym) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1856
                (aSymbol = sym) ifFalse:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1857
                    possibleCompletions add:aSymbol
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1858
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1859
            ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1860
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1861
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1862
    (nodeOrNil notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1863
    and:[ (parent := nodeOrNil parent) notNil
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1864
    and:[ parent isMessage ]]) ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1865
        parentSelector := parent selector.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1866
        ( #( perform: perform:ifNotUnderstood: ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1867
            symbolSelectorClass := self classOfNode:parent receiver.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1868
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1869
        ( #( #'onChangeSend:' ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1870
            "/ assume that send-target will be self.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1871
            (methodOrNil notNil and:[ methodOrNil selector notNil and:[ methodOrNil selector isUnarySelector ]]) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1872
                addSymbol value:(methodOrNil selector,'Changed').
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1873
            ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1874
            symbolSelectorClass := classOrNil.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1875
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1876
        ( #( #'onChangeSend:to:' ) includes: parentSelector) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1877
            symbolSelectorClass := self classOfNode:parent arguments second.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1878
        ].
5074
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1879
        
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1880
        "/ actually, I found that this gives good suggestions.
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1881
        symbolSelectorClass isNil ifTrue:[
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1882
            symbolSelectorClass := classOrNil.
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1883
        ].
1f0c4ef255d8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5071
diff changeset
  1884
        
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1885
        symbolSelectorClass notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1886
            symbolSelectorClass withAllSuperclassesDo:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1887
                cls ~~ Object ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1888
                    cls ~~ Model ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1889
                        cls methodDictionary keysDo:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1890
                    ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1891
                ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1892
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1893
        ].
4382
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1894
    ].
e92f704c63ec class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4381
diff changeset
  1895
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1896
    (considerAll or:[classOrNil isNil]) ifTrue:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1897
        Smalltalk allClassesDo:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1898
            cls theNonMetaclass methodDictionary keys do:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1899
            cls theMetaclass methodDictionary keys do:addSymbol.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1900
        ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1901
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1902
        "/ Symbol allInstancesDo:addSymbol.
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  1903
    ] ifFalse:[
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1904
        Smalltalk allClassesInCategory:classOrNil do:[:cls |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1905
            cls theNonMetaclass instAndClassMethodsDo:[:mthd |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1906
                mthd usedSymbols do:addSymbol
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1907
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1908
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1909
    ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1910
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1911
    "/ add symbolic literals (especially for spec methods)
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1912
    classOrNil notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1913
        classOrNil theMetaclass instAndClassMethodsDo:[:mthd |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1914
            mthd literalsDo:[:lit |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1915
                lit isSymbol ifTrue:[ addSymbol value: lit ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1916
            ].    
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1917
        ].    
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1918
    ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1919
    
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  1920
    possibleCompletions := possibleCompletions asOrderedCollection sort.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1921
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1922
    longest := possibleCompletions longestCommonPrefix.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1923
    possibleCompletions remove:longest ifAbsent:[].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1924
    possibleCompletions addFirst: longest.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1925
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1926
    editAction :=
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1927
        [:chosenIndex |
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1928
            |chosen oldSym oldLen newLen|
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1929
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1930
            chosen := possibleCompletions at:chosenIndex.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1931
            chosen notNil ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1932
                (codeView characterAtCharacterPosition:start) == $# ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1933
                    start := start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1934
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1935
                (codeView characterAtCharacterPosition:start) == $' ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1936
                    start := start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1937
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1938
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1939
                oldSym := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1940
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1941
                codeView
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1942
                    undoableDo:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1943
                        codeView replaceFromCharacterPosition:start to:stop with:chosen
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1944
                    ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1945
                    info:'Completion'.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1946
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1947
                (chosen startsWith:oldSym) ifTrue:[
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1948
                    oldLen := stop - start + 1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1949
                    newLen := chosen size.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1950
                    codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1951
                    codeView dontReplaceSelectionOnInput
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1952
                ].
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1953
            ]
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1954
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1955
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1956
    actionBlock value:possibleCompletions value:editAction value:'symbol'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1957
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1958
    "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
  1959
    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1960
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1961
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1962
codeCompletionForMessage:node into:actionBlock
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  1963
    "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
  1964
    
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1965
    |selector lcSelector bestSelectors parentSelector newParentSelector bestSelectors2 bestWithParenthesis allBest numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  1966
     newParts nSelParts oldLen newLen selectorParts
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1967
     parentNode nodeReceiver "selectorsSentInCode" selectorsImplementedInClass
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  1968
     editAction parentNodeClassIfKnown
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1969
     receiverNodeClassIfKnown 
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1970
     offerParenthisationAroundNode parenthesisAroundIndex parentNodeToParenthesize
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1971
     offerValueInsertion valueToInsert valueToInsertIndex valueInfo
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  1972
     classesFromAssignmentsToReceiver otherMessagesToReceiver
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  1973
     canParenthesize classesOfReceiver|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1974
 
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1975
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1976
        Transcript show:'node '; show:node; show:' ; '.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1977
        Transcript show:'msg in '; show:methodOrNil; show:' / '; showCR:classOrNil.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1978
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1979
    
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1980
    offerParenthisationAroundNode := nil.
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  1981
    offerValueInsertion := false.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  1982
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  1983
    selector := node selector.
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  1984
    lcSelector := selector asLowercase.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  1985
    parentNode := node parent.
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  1986
    nodeReceiver := node receiver.
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  1987
    nodeReceiver notNil ifTrue:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  1988
        classesOfReceiver := self classesOfNode:nodeReceiver.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  1989
    ].
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1990
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1991
        Transcript show:node; show:' -> '; showCR:classesOfReceiver.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1992
        ( node isVariable and:[node name = 'self']) ifTrue:[self halt].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1993
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  1994
    
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  1995
    "/ 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
  1996
    "/ do not attempt to complete the current message.
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  1997
    "/ If it is a message, we will look for parent-message completion also below (best2 stuff)
5385
730032499904 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5379
diff changeset
  1998
    (codeView characterBeforeCursor ? Character space) isSeparator ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  1999
        selector isKeyword ifFalse:[
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2000
            self codeCompletionForMessageTo:node into:actionBlock.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2001
            ^ self
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2002
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2003
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2004
 
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2005
    "/ only do this if the node-message has no parents around
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2006
    node parentheses isEmptyOrNil ifTrue:[
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2007
        Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2008
            Transcript show:'try for: '; showCR:nodeReceiver
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2009
        ].    
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2010
        bestSelectors := self findBest:nodeReceiver for:selector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2011
                              inClasses:classesOfReceiver
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2012
    ] ifFalse:[
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2013
        bestSelectors := OrderedCollection new.
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  2014
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2015
 
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2016
    "/ if the receiver is a real variable,
4386
d5b6d7c0b6ee class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
  2017
    "/ 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
  2018
    "/ 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
  2019
    (tree notNil
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2020
        and:[ nodeReceiver isVariable
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2021
        and:[ nodeReceiver isSelf not
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2022
        and:[ nodeReceiver isSuper not ]]])
4366
8041b628bba3 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4365
diff changeset
  2023
    ifTrue:[
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2024
        |receiverName possibleClasses possibleClassesFromOtherSends|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2025
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2026
        receiverName := nodeReceiver name.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2027
 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2028
        classesFromAssignmentsToReceiver := self classesFromAssignmentTo:receiverName in:tree.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2029
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2030
        possibleClasses := classesFromAssignmentsToReceiver.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2031
        possibleClasses isEmpty ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2032
            "/ messages sent
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2033
            otherMessagesToReceiver := self messagesSentTo:receiverName in:tree.
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2034
            otherMessagesToReceiver remove:selector ifAbsent:[].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2035
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2036
            otherMessagesToReceiver notEmpty ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2037
                "/ classes which respond to all
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2038
                possibleClassesFromOtherSends :=
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2039
                    Smalltalk 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2040
                        allClassesForWhich:[:cls |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2041
                            cls isLoaded
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2042
                            and:[ otherMessagesToReceiver
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2043
                                    conform:[:eachSelectorSent | cls canUnderstand:eachSelectorSent]]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2044
                        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2045
                possibleClasses := possibleClasses , possibleClassesFromOtherSends.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2046
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2047
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2048
 
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2049
        "/ if the receiver is a classVar/classInstVar,
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2050
        "/ include the class of its current value and UndefinedObject.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2051
        "/ This helps to complete class methods and (lazy) initializer code.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2052
        (classOrNil notNil) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2053
            |tryValue currentValue|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2054
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2055
            tryValue := false.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2056
            (classOrNil theNonMetaclass allClassVarNames includes: receiverName) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2057
                tryValue := true.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2058
                currentValue := classOrNil theNonMetaclass classVarAt:receiverName.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2059
            ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2060
                (classOrNil isMeta and:[ classOrNil allInstVarNames includes: receiverName ]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2061
                    tryValue := true.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2062
                    currentValue := classOrNil theNonMetaclass instVarNamed:receiverName.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2063
                ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2064
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2065
            tryValue ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2066
                possibleClasses := { currentValue class } , possibleClasses.
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
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2069
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2070
        (possibleClasses notEmpty and:[possibleClasses size < 15]) ifTrue:[
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2071
            bestSelectors :=
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2072
                (possibleClasses 
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2073
                    collectAll:[:eachClass |
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2074
                        Parser findBest:30 selectorsFor:selector in:eachClass forCompletion:true.
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  2075
                    ] as:Set) asOrderedCollection.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2076
 
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2077
            "/ if any of those is a prefix-keyword of the selector,
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2078
            "/ 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
  2079
            bestSelectors := bestSelectors reject: [:sel | (selector startsWith: sel) or: [selector endsWith: sel]].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2080
        ].
4619
edb90d73576b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4618
diff changeset
  2081
    ].                                                                            
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2082
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2083
    "/ if we are behind a keyword messages colon,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2084
    "/ only look for matching prefix selectors;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2085
    "/ also, a good completion is to insert an argument;
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2086
    "/ 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
  2087
    "/ Array new:1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2088
    selector isKeyword ifTrue:[
5385
730032499904 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5379
diff changeset
  2089
        (node arguments size = selector argumentCount) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2090
            offerParenthisationAroundNode := node. 
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2091
            "/ Transcript show:'2:'; showCR:node.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2092
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2093
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2094
        codeView characterBeforeCursor == $: ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2095
            (bestSelectors select:[:sel | sel asLowercase startsWith:lcSelector]) isEmpty ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2096
                "/ nothing better around
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2097
                |argIndex argNames argNameStrings impls|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2098
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2099
                argIndex := node selectorParts size.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2100
                argNames := Set new.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2101
                argNameStrings := OrderedCollection new.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2102
                impls := Smalltalk allImplementorsOf:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2103
                impls size < 10 ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2104
                    impls do:[:eachImplClass |
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2105
                        |mthd argName|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2106
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2107
                        mthd := (eachImplClass compiledMethodAt:selector).
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2108
                        argName := (mthd methodArgNames ? #()) at:argIndex ifAbsent:nil.
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2109
                        argName notNil ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2110
                            (argNames includes:argName) ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2111
                                argNames add:argName.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2112
                                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
  2113
                            ].    
4764
3142fc3b57cd class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4731
diff changeset
  2114
                        ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2115
                    ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2116
                    argNameStrings notEmptyOrNil ifTrue: [
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2117
                        argNameStrings := argNameStrings asOrderedCollection sort.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2118
                        actionBlock value:argNameStrings value:[:selIndex | ] value: 'argument name hint'.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2119
                        ^ self.
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
                ]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2122
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2123
        ].
4369
810a78e62f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  2124
    ] ifFalse:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2125
        "/ 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
  2126
        "/ only consider longer keyword messages or unary messages.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2127
        "/ unless the node is parenthesized
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2128
        node hasParentheses ifFalse:[ 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2129
            (parentNode notNil and:[ parentNode isKeywordMessage ]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2130
                bestSelectors := bestSelectors select:[:sel | sel isUnarySelector or:[ sel startsWith:sel]]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2131
            ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2132
        ]
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2133
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2134
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2135
"/    bestSelectors := bestSelectors asOrderedCollection.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2136
"/    bestSelectors sort:[:a :b | a size < b size].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2137
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2138
    (selector isUnarySelector and:[ parentNode notNil and:[ parentNode isMessage ]]) ifTrue:[
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2139
        (parentSelector := parentNode selector) isKeyword ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2140
            "/ 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
  2141
            "/ 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
  2142
            newParentSelector := parentSelector,selector.
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2143
            bestSelectors2 := self 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2144
                                findBest:(parentNode receiver) for:newParentSelector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2145
                                inClasses:(self classesOfNode:parentNode receiver).
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2146
            bestSelectors2 := bestSelectors2 select:[:sel | sel isKeyword and:[ sel startsWith:parentSelector]].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2147
            bestSelectors2 := bestSelectors2 asOrderedCollection sort:[:a :b | a size < b size].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2148
            bestSelectors := bestSelectors reject:[:sel | bestSelectors2 includes:sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2149
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2150
            "/ if the parent has a valid selector, offer parenthization
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2151
            (Smalltalk someImplementorOf:parentSelector) notNil ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2152
                offerParenthisationAroundNode := parentNode.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2153
                "/ Transcript show:'2:'; showCR:parentNode.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2154
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2155
        ] ifFalse:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2156
            |kwSels|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2157
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2158
            "/ if its a unary message AND the parent is a unary or binary node, 
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2159
            "/ try again, sending the partial message
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2160
            "/ as a keyword to the parent node.
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2161
            "/ this is the case when after "foo binOp bar if", or "foo unOp bar if"
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2162
            "/ which should include ifTrue: in the suggestion result.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2163
            
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2164
            "/ suggestion will transform from (the incorrectly parsed)
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2165
            "/    foo == (shift if)
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2166
            "/
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2167
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2168
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2169
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2170
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2171
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2172
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2173
            "/           arg
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2174
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2175
            "/ into:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2176
            "/    (foo == shift) if
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2177
            "/
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2178
            "/        nonKWsel-msg(parent)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2179
            "/     /         \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2180
            "/    /           \
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2181
            "/  rcvr         sel-unary(node)
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2182
            "/              /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2183
            "/             /
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2184
            "/           arg
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2185
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2186
            "/ but only do this, if typing to the end of the parent message
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2187
            "/ (i.e. after (foo == shift) <-
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2188
            "/    or after foo bar baz <-
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2189
            "/ not if typing into an existing message
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2190
            "/ (i.e. into foo == shift <- more
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2191
            "/    or into foo bar <- baz
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2192
            codeView characterPositionOfCursor >= parentNode stop ifTrue:[
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2193
                kwSels := self 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2194
                                findBest:parentNode for:selector 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  2195
                                inClasses:(self classesOfNode:parentNode).
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2196
                kwSels := kwSels select:[:sel | sel isKeyword].
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2197
     
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2198
                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
  2199
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2200
                bestSelectors := bestSelectors reject:[:sel | kwSels includes:sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2201
 
5103
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2202
                "/ these need to go to bestSelectors (see editAction)
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2203
                parentNodeClassIfKnown := self classOfNode:parentNode.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2204
                (parentNodeClassIfKnown notNil and:[ parentNodeClassIfKnown includesBehavior: Boolean ]) ifTrue:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2205
                    "/ this is so common, that it deserves a special case:
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2206
                    "/ if we complete an if after some boolean message e.g '(a == b) if'
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2207
                    "/ throw out the very unlikely ifNil, ifEmpty etc. messages (which are inherited by Object, but absolutely unrealistic)
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2208
                    bestSelectors := self
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2209
                                        withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2210
                                        from:bestSelectors
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2211
                                        forPartial:selector.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2212
                    kwSels := self
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2213
                                withoutSelectorsUnlikelyFor:parentNodeClassIfKnown
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2214
                                from:kwSels
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2215
                                forPartial:selector.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2216
     
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2217
                    "/ put keyword selectors in front, because they are very likely
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2218
                    bestSelectors := kwSels , bestSelectors.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2219
                ] ifFalse:[
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2220
                    "/ put them at the end
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2221
                    bestSelectors := bestSelectors , kwSels.
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2222
                ].
fc854b0d6ee8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5102
diff changeset
  2223
            ]
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2224
        ]
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2225
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2226
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2227
    (selector isUnarySelector and:[ node isMessage ]) ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2228
        receiverNodeClassIfKnown := self classOfNode:nodeReceiver.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2229
        (receiverNodeClassIfKnown notNil and:[ receiverNodeClassIfKnown includesBehavior: Boolean ]) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2230
            "/ this is so common, that it deserves a special case:
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2231
            "/ 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
  2232
            "/ 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
  2233
            bestSelectors := self
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2234
                                withoutSelectorsUnlikelyFor:receiverNodeClassIfKnown
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2235
                                from:bestSelectors
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2236
                                forPartial:selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2237
        ].
4375
305981eb7976 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4374
diff changeset
  2238
    ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2239
    
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2240
    Verbose == true ifTrue:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2241
        Transcript show:'parentNode: '; showCR:parentNode.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2242
        Transcript show:'parentNode: '; showCR:parentNode class.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2243
        Transcript show:'sel: '; showCR:selector.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2244
    ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2245
    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2246
    canParenthesize := false.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2247
    parentNode notNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2248
        parentNode isMessage ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2249
            (((parentNode selector isUnarySelector not) and:[selector isUnarySelector])
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2250
            or:[ ((parentNode selector isKeyword) and:[selector isBinarySelector]) ]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2251
                canParenthesize := true.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2252
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2253
        ] ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2254
            offerParenthisationAroundNode isNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2255
                selector isKeyword ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2256
                    offerParenthisationAroundNode := node.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2257
                ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2258
            ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2259
        ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2260
    ].    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2261
    canParenthesize ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2262
        "/ 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
  2263
        "/ if, and, or or while.
5203
9b8272cc6d49 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5146
diff changeset
  2264
        "/ Here, offer a special completion which inserts parentheses / brackets around the already
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2265
        "/ 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
  2266
        "/    expr wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2267
        "/ ->
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2268
        "/    [expr] whileXX:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2269
        true "((
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2270
            #( '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
  2271
        ) contains:[:part | part startsWith:selector])" ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2272
            (Smalltalk someImplementorOf:parentNode selector) notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2273
                |selsP selsB|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2274
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2275
                selsP := #( 'ifTrue:' 'ifFalse:' 'and' 'or' 'do' 'keysAndValuesDo' )
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2276
                            select:[:sel | sel startsWith:selector]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2277
                            thenCollect:[:sel | '(',parentNode selector,') ',sel].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2278
                ( #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' ) contains:[:sel | sel startsWith:selector]) 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2279
                ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2280
                    selsP := selsP copyWith:'(',parentNode selector,') ',selector  
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2281
                ]. 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2282
                selsB := #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' )
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2283
                            select:[:sel | sel startsWith:selector]
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2284
                            thenCollect:[:sel | '[',parentNode selector,'] ',sel].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2285
                parentNodeToParenthesize := parentNode.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2286
                bestWithParenthesis := selsP , selsB.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2287
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2288
        ].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  2289
    ] ifFalse:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2290
        "/ also offer adding brackets for a while expression
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2291
        "/    expr wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2292
        "/ ->
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2293
        "/    [expr] whileXX:[]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2294
        ((
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2295
            #( 'whileTrue' 'whileFalse' 'ensure' 'on')
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2296
        ) contains:[:part | part startsWith:selector]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2297
            (node receiver isBlock) ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2298
                |sels|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2299
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2300
                (node receiver isMessage not
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2301
                or:[ (Smalltalk someImplementorOf:node receiver selector) notNil ]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2302
                    sels := #( 'whileTrue:' 'whileFalse:' 'ensure:' 'on:do:' )
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2303
                                select:[:sel | sel startsWith:selector]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2304
                                thenCollect:[:sel | '[...] ',sel].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2305
                    parentNodeToParenthesize := node receiver.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2306
                    bestWithParenthesis := sels.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2307
                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2308
            ].
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2309
        ].
4416
ebb04dca4484 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4413
diff changeset
  2310
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2311
 
5419
7ba6ce8016c2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5392
diff changeset
  2312
    allBest := (bestSelectors ? #()) , (bestSelectors2 ? #()) asOrderedCollection.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2313
    self sortSelectors:allBest forSelector:selector lcSelector:lcSelector.
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2314
                        
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2315
    "/ sort: prefixes first.
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2316
    parentSelector notNil ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2317
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2318
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2319
                    by:[:sel | 
5031
ea94aa3cb834 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5027
diff changeset
  2320
                            (sel asLowercase startsWith:lcSelector) 
5058
925bc542ebd1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5052
diff changeset
  2321
                            or:[sel startsWith:parentSelector]].
4388
a2a5955d733c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4387
diff changeset
  2322
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2323
 
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  2324
    "/ if receiver is super, always include the method's own selector
4408
18567ee46c6a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4407
diff changeset
  2325
    nodeReceiver isSuper ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2326
        (tree isMethod) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2327
            |mSel|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2328
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2329
            mSel := tree selector.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2330
            mSel notNil ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2331
                (mSel startsWith:selector) ifTrue:[
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2332
                    "/ already the word before the cursor?
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2333
                    (mSel ~= selector) ifTrue:[
5419
7ba6ce8016c2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5392
diff changeset
  2334
                        allBest removeAndAddFirst:mSel.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2335
                    ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2336
                ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2337
            ]
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2338
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2339
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2340
 
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2341
    "/ another convenient hack; 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2342
    "/ if we have just typed in foo == 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2343
    "/ and the value of foo is a known literal,
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2344
    "/ offer inserting this literal. This is great in a debugger...
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2345
    ( #(#'==' #'=' #'~=' #'~~') includes:selector ) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2346
        |val|
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2347
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2348
        (val := self valueOfNode:nodeReceiver) notNil ifTrue:[
5285
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2349
            "/ this can raise an error, if val does not like to generate a storeString
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2350
            "/ (it is recursive, or an X11GraphicsContext, for example)
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2351
            Error handle:[:ex |
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2352
            ] do:[
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2353
                valueToInsert := val storeString.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2354
                offerValueInsertion := true.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2355
                nodeReceiver isVariable ifTrue:[
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2356
                    valueInfo := ' (current value of %1)' bindWith:nodeReceiver name.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2357
                ] ifFalse:[                
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2358
                    valueInfo := ' (current value of expression)'.
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2359
                ].
6472a320f8d4 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5274
diff changeset
  2360
                valueInfo := valueInfo withColor:(Color grey).
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2361
            ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2362
        ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2363
    ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2364
    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2365
    (allBest isEmptyOrNil 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2366
        and:[bestWithParenthesis isEmptyOrNil
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2367
        and:[offerParenthisationAroundNode isNil
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2368
        and:[offerValueInsertion not]]] 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2369
    ) ifTrue:[ 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2370
        ^ self 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2371
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2372
 
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2373
"/    "/ 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
  2374
"/    "/ and also what is assigned to it.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2375
"/    nodeReceiver notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2376
"/        nodeReceiver isVariable ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2377
"/            rememberedNodes notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2378
"/                selectorsSentInCode := 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2379
"/                    (rememberedNodes
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2380
"/                        select:[:node | 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2381
"/                            node isMessage 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2382
"/                                and:[node receiver isVariable
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2383
"/                                and:[node receiver name = nodeReceiver name]]]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2384
"/                        thenCollect:[:node | 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2385
"/                            node selector]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2386
"/                    ) asSet.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2387
"/            ] ifFalse:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2388
"/                selectorsSentInCode := Set new. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2389
"/                tree allMessageNodesDo:[:msg |
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2390
"/                    (msg receiver isVariable
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2391
"/                        and:[msg receiver name = nodeReceiver name]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2392
"/                    ) ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2393
"/                        selectorsSentInCode add:msg selector
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2394
"/                    ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2395
"/                ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2396
"/                selectorsSentInCode remove:selector ifAbsent:[].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2397
"/            ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2398
"/        ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2399
"/    ]. 
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2400
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2401
    nodeReceiver notNil ifTrue:[
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2402
        |classOrNil|
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2403
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2404
        classOrNil := self classOfNode:nodeReceiver.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2405
        classOrNil isNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2406
            classesFromAssignmentsToReceiver size == 1 ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2407
                classOrNil := classesFromAssignmentsToReceiver anElement
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2408
            ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2409
        ].
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2410
        classOrNil notNil ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2411
            selectorsImplementedInClass := classOrNil selectors.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2412
"/            selectorsImplementedInClass := Set new.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2413
"/            classOrNil withAllSuperclassesDo:[:cls |
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2414
"/                cls theNonMetaclass ~~ Object ifTrue:[
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2415
"/                    selectorsImplementedInClass addAll:cls selectors.
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2416
"/                ]
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2417
"/            ]    
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2418
        ]
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  2419
    ].    
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2420
    selectorsImplementedInClass notNil ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2421
        "/ 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
  2422
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2423
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2424
                    by:[:sel | selectorsImplementedInClass includes:sel].
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  2425
    ].
5042
151b3c1bf4d1 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5041
diff changeset
  2426
    otherMessagesToReceiver "selectorsSentInCode" notNil ifTrue:[
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2427
        "/ 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
  2428
        "/ 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
  2429
        "/ selectors sent previously. sigh.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2430
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2431
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2432
                    by:[:sel | otherMessagesToReceiver "selectorsSentInCode" includes:sel].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2433
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2434
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2435
"/ this makes it very slow
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2436
"/false ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2437
"/    srchClass notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2438
"/        implClass := srchClass whichClassIncludesSelector:best.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2439
"/    ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2440
"/        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
  2441
"/        implClass size == 1 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2442
"/            implClass := implClass first.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2443
"/        ] ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2444
"/            implClass := nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2445
"/        ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2446
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2447
"/
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2448
"/    info := best storeString.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2449
"/    implClass notNil ifTrue:[
5397
HG Automerge
parents: 5388 5392
diff changeset
  2450
"/        info := implClass name , '  ' , info.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2451
"/    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2452
"/    self information:info.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2453
"/].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2454
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2455
    "/ 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
  2456
    allBest := self splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2457
                    by:[:sel | sel notNil and:[sel asLowercase startsWith:lcSelector]].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2458
 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2459
    "/ heuristic hack:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2460
    "/ '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
  2461
    "/ we know, that those are most often wanted!!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2462
    selector size <= 2 ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2463
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2464
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2465
                    by:[:sel | 
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2466
                        #(ifTrue: ifFalse: isNil notNil whileTrue whileFalse) includes:sel
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2467
                    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2468
    ]. 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2469
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2470
    self sortUsefulSelectorsIn:allBest. "/cosmetics
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2471
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2472
    "/ parenthesizers always at the end.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2473
    bestWithParenthesis notEmptyOrNil ifTrue:[ 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2474
        allBest := allBest , bestWithParenthesis.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2475
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2476
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2477
    "/ self at:1 put:#foo
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2478
    "/ Array new:10
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2479
    offerParenthisationAroundNode notNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2480
        allBest := allBest copyWith:( '(',selector,')' ).
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2481
        parenthesisAroundIndex := allBest size.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2482
    ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2483
    offerValueInsertion ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2484
        allBest := allBest copyWith:( '... ',(valueToInsert contractTo:30),valueInfo). 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2485
        valueToInsertIndex := allBest size.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2486
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2487
 
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2488
    editAction :=
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2489
        [:index |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2490
            |crsrPos chosen parenthesisToInsert action|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2491
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2492
            action := nil.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2493
            crsrPos := codeView characterPositionOfCursor.
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2494
            chosen := allBest at:index.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2495
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2496
            chosen ~= selector ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2497
                (bestWithParenthesis notNil and:[bestWithParenthesis includes:chosen]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2498
                    "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2499
                    "/   chosen at: 10 if
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2500
                    "/ put parenthesis around, and add ifTrue/ifFalse
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2501
                    "/ i.e.:   (chosen at:10) ifTrue:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2502
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2503
                    "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2504
                    "/   a > 10 wh
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2505
                    "/ put brackets around and add whileTrue/whileFalse
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2506
                    "/ i.e.:   [a > 10] whileTrue:[]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2507
                    parenthesisToInsert := chosen first == $( ifTrue:'()' ifFalse:'[]'.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2508
                    chosen := (chosen copyFrom:(chosen lastIndexOf:parenthesisToInsert second)+1) withoutSeparators.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2509
                ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2510
                    (offerParenthisationAroundNode notNil and:[index = parenthesisAroundIndex]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2511
                        "/ for input like: 
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2512
                        "/      Array new:10
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2513
                        "/ put parenthesis around.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2514
                        "/ i.e.:   (Array new:10)
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2515
                        action :=
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2516
                            [
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2517
                                codeView insertString:'(' atCharacterPosition:offerParenthisationAroundNode start.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2518
                                codeView insertString:')' atCharacterPosition:offerParenthisationAroundNode stop+2.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2519
                                codeView cursorToCharacterPosition:(offerParenthisationAroundNode stop+2); cursorRight.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2520
                            ].
5071
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2521
                    ] ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2522
                        (offerValueInsertion and:[index = valueToInsertIndex]) ifTrue:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2523
                            "/ for input like: 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2524
                            "/      foo == 
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2525
                            "/ insert a value
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2526
                            "/ i.e.:   foo == #someSymbol
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2527
                            action :=
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2528
                                [
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2529
                                    codeView characterBeforeCursor isSeparator ifFalse:[
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2530
                                        codeView insertStringAtCursor:' '.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2531
                                    ].    
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2532
                                    codeView insertStringAtCursor:valueToInsert.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2533
                                    "/ codeView cursorRight.
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2534
                                ].
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2535
                        ]
976ed2a22e27 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5070
diff changeset
  2536
                    ].    
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2537
                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2538
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2539
                action isNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2540
                    numArgs := chosen numArgs.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2541
                    (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:chosen]) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2542
                        selectorParts := parentNode selectorParts , node selectorParts.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2543
                    ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2544
                        selectorParts := node selectorParts.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2545
                    ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2546
                    nSelParts := selectorParts 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
                    newParts := chosen asCollectionOfSubstringsSeparatedBy:$:.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2549
                    newParts := newParts select:[:part | part size > 0].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2550
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2551
                    action :=
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
                            |positionOfFirstArg newCursorPosition stop checkForArgumentTemplates
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2554
                             newPart oldPartialToken start|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2555
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2556
                            checkForArgumentTemplates := (selector isUnarySelector and:[chosen isKeywordSelector]).
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2557
                            numArgs > nSelParts ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2558
                                "/ new selector has more arguments; append them
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2559
                                stop := selectorParts last stop.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2560
                                codeView deleteFromCharacterPosition:stop+1 to:crsrPos-1.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2561
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2562
                                "/ append the rest ...
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2563
                                (numArgs min:newParts size) downTo:(nSelParts+1) do:[:idx |
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2564
                                    |newPart|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2565
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2566
                                    newPart := newParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2567
                                    newPart := newPart , ':'.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2568
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2569
                                    (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2570
                                        newPart := ':' , newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2571
                                    ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2572
                                    newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2573
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2574
                                    codeView replaceFromCharacterPosition:stop to:stop with:newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2575
                                    "/ remember the leftMost replacement's end as new cursor position
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2576
                                    newCursorPosition := stop + newPart size
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2577
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2578
                                checkForArgumentTemplates := true.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2579
                            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2580
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2581
                            "/ replace existing parts
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2582
                            (nSelParts min:newParts size) downTo:1 do:[:idx |
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2583
                                |skipColon|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2584
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2585
                                skipColon := 0.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2586
                                newPart := newParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2587
                                oldPartialToken := selectorParts at:idx.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2588
                                start := oldPartialToken start.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2589
                                stop := oldPartialToken stop.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2590
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2591
                                (chosen endsWith:$:) ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2592
                                    (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2593
                                        newPart := newPart , ':'.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2594
                                    ] ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2595
                                        skipColon := 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2596
                                    ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2597
                                ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2598
                                    (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2599
                                        newPart := newPart , ':'
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2600
                                    ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2601
                                        |nextChar|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2602
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2603
                                        nextChar := codeView characterAtCharacterPosition:stop+1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2604
                                        nextChar isSeparator ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2605
                                            nextChar == $. ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2606
                                                newPart := newPart , ' '
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2607
                                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2608
                                        ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2609
                                    ]
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2610
            "/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2611
            "/                        ] ifFalse:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2612
            "/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2613
                                ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2614
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2615
                                oldPartialToken value ~= newPart ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2616
                                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2617
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2618
                                    oldLen := stop - start + 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2619
                                    newLen := newPart size.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2620
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2621
                                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2622
                                    "/ remember the leftMost replacement's end as new cursor position
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2623
                                    newCursorPosition := start + newPart size + skipColon. "/ (newLen-oldLen) + 1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2624
                                    "/ codeView cursorToCharacterPosition:newCursorPosition.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2625
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2626
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2627
                            newCursorPosition notNil ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2628
                                codeView cursorToCharacterPosition:newCursorPosition-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2629
                                codeView cursorRight.  "/ avoid going to the next line !!
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2630
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2631
                            codeView dontReplaceSelectionOnInput.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2632
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2633
                            checkForArgumentTemplates ifTrue:[
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2634
                                "/ add opening brackets, etc.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2635
                                self insertAdditonalStuffAfterSelector:chosen.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2636
                            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2637
                            parenthesisToInsert notNil ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2638
                                |sav pos|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2639
 
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2640
                                sav := codeView characterPositionOfCursor-1.
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2641
                                "/ check if already parenthized
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2642
                                parentNodeToParenthesize hasParentheses ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2643
                                    pos := parentNodeToParenthesize parentheses first first.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2644
                                    codeView selectFromCharacterPosition:pos to:pos.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2645
                                    codeView replaceSelectionBy:(parenthesisToInsert copyFirst:1) asString.
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
                                    pos := parentNodeToParenthesize parentheses first last.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2648
                                    codeView selectFromCharacterPosition:pos to:pos.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2649
                                    codeView replaceSelectionBy:(parenthesisToInsert copyLast:1) asString.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2650
                                    codeView cursorToCharacterPosition:sav; cursorRight
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2651
                                ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2652
                                    codeView insertString:(parenthesisToInsert copyLast:1) atCharacterPosition:node receiver stop+1.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2653
                                    codeView insertString:(parenthesisToInsert copyFirst:1) atCharacterPosition:parentNodeToParenthesize start.
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2654
                                    codeView cursorToCharacterPosition:sav+2; cursorRight
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2655
                                ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2656
                            ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2657
                        ].
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2658
                    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2659
 
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2660
                codeView
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2661
                    undoableDo:action
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  2662
                    info:'Completion'.
4610
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2663
            ].
6e07eb8f8e8b class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4592
diff changeset
  2664
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2665
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2666
    actionBlock value:allBest value:editAction value:nil.
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
    "Created: / 10-11-2006 / 13:18:27 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2669
    "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
  2670
    "Modified: / 01-05-2016 / 18:36:36 / cg"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2671
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2672
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2673
codeCompletionForMessageTo:node into:actionBlock
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2674
    "find good suggestions for a message send to node, with no input yet.
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2675
     I.e. right after a receiver (w.o. any input yet)"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2676
    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2677
    |knownClass suggestions selectorsImplementedInClass mostUseful editActions pos|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2678
 
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2679
    (knownClass := self classOfNode:node) isNil ifTrue:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2680
        self breakPoint:#cg.
5113
6a5ae22ee501 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5112
diff changeset
  2681
        "/ self classOfNode:node.
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2682
        ^ self
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2683
    ].
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  2684
    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2685
    Verbose == true ifTrue:[ 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2686
        Transcript show:node; show:' -> '; showCR:knownClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  2687
    ].    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2688
    selectorsImplementedInClass := Set new.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2689
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2690
    knownClass withAllSuperclassesDo:[:cls |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2691
        cls ~~ Object ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2692
            selectorsImplementedInClass addAll:cls selectors.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2693
        ]    
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2694
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2695
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2696
    knownClass isMeta ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2697
        selectorsImplementedInClass := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2698
            selectorsImplementedInClass reject:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2699
                |mthd|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2700
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2701
                mthd := knownClass lookupMethodFor:sel.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2702
                mthd notNil and:[mthd category startsWith: 'documentation']
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2703
            ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2704
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2705
        knownClass theNonMetaclass isAbstract ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2706
            mostUseful := selectorsImplementedInClass select:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2707
                            knownClass implements:sel
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2708
                          ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2709
        ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2710
            mostUseful := selectorsImplementedInClass select:[:sel |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2711
                                |mthd|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2712
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2713
                                mthd := knownClass lookupMethodFor:sel.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2714
                                mthd notNil and:[mthd category startsWith: 'instance']
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2715
                          ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2716
        ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2717
    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2718
        mostUseful := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2719
            #(
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2720
                "/ blocks
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2721
                ifTrue: ifFalse: whileTrue: whileFalse: on:do: ensure: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2722
                whileTrue whileFalse loop
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2723
                "/ any
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2724
                isNil notNil isEmpty notEmpty 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2725
            ).
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2726
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2727
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2728
    mostUseful notNil ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2729
        suggestions := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2730
            (selectorsImplementedInClass select:[:sel | mostUseful includes:sel]) asNewOrderedCollection sort
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2731
            ,
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2732
            (selectorsImplementedInClass reject:[:sel | mostUseful includes:sel]) asNewOrderedCollection sort.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2733
    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2734
        suggestions := selectorsImplementedInClass asNewOrderedCollection sort.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2735
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2736
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  2737
    suggestions := suggestions reject:[:sel | sel first == $_].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2738
    self sortUsefulSelectorsIn:suggestions. "/cosmetics
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2739
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2740
    pos := codeView characterPositionOfCursor.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2741
    editActions := suggestions collect:[:word |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2742
                        self editActionToReplaceCodeFrom:pos to:pos-1 by:word.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2743
                   ].                
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  2744
    actionBlock value:suggestions value:editActions value:nil.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2745
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  2746
    "Created: / 01-05-2016 / 17:01:21 / cg"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  2747
    "Modified: / 01-05-2016 / 18:54:03 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2748
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2749
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2750
codeCompletionForMethodSpec:node
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2751
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2752
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2753
    self
5312
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2754
        codeCompletionForMethodSpec:node
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2755
        into:
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2756
            [:suggestions :action :whatIsIt |
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2757
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2758
            |chosen|
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2759
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2760
            chosen := self askUserForCompletion:whatIsIt for:codeView
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2761
                           at:node start from:suggestions.
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2762
            chosen notNil ifTrue:[
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2763
                action value:(suggestions indexOf:chosen)
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2764
            ].
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2765
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2766
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2767
"/    |crsrPos
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2768
"/     selectorSoFar matchingSelectors
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2769
"/     selectors distances best rest
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2770
"/     allExistingMethods nameBag namesByCount selectors1 selectors2|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2771
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2772
"/    crsrPos := codeView characterPositionOfCursor - 1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2773
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2774
"/    selectorSoFar := ''.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2775
"/    node selectorParts doWithIndex:[:partToken :argNr|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2776
"/        |part|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2777
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2778
"/        part := partToken value.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2779
"/        selectorSoFar := selectorSoFar , part.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2780
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2781
"/        (crsrPos >= partToken start
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2782
"/        and:[crsrPos <= partToken stop]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2783
"/            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2784
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2785
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2786
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2787
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2788
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2789
"/                                        md := eachClass theMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2790
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2791
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2792
"/                                    ].
5312
a16f68b2aba1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5285
diff changeset
  2793
"/                "/ don't forget the stuff in the class-line
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2794
"/                Metaclass withAllSuperclassesDo:[:cls |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2795
"/                    matchingSelectors addAll:(cls methodDictionary keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2796
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2797
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2798
"/                matchingSelectors := Smalltalk allClasses
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2799
"/                                    inject:(Set new)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2800
"/                                    into:[:theSet :eachClass |
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2801
"/                                        |md|
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2802
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2803
"/                                        md := eachClass theNonMetaclass methodDictionary.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2804
"/                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2805
"/                                        theSet.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2806
"/                                    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2807
"/            ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2808
"/            selectors := matchingSelectors asOrderedCollection.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2809
"/
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2810
"/            "/ 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
  2811
"/            (selectors size == 1
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2812
"/            and:[selectors first = selectorSoFar]) ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2813
"/                selectorSoFar numArgs == 0 ifTrue:[ ^ self ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2814
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2815
"/                allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2816
"/                                        collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2817
"/                nameBag := Bag new.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2818
"/                allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2819
"/                namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2820
"/                "/ take the one which occurs most often
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2821
"/                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
  2822
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2823
"/                codeView
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2824
"/                    undoableDo:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2825
"/                        (crsrPos+1) >= codeView contents size ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2826
"/                            codeView paste:best.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2827
"/                        ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2828
"/                            codeView insertString:best atCharacterPosition:crsrPos+1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2829
"/                        ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2830
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2831
"/                    info:'completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2832
"/                codeView cursorToCharacterPosition:(crsrPos + best size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2833
"/            ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2834
"/                "the ones implemented in superclasses are shown first"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2835
"/                classOrNil notNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2836
"/                    selectors1 := selectors select:[:sel | classOrNil respondsTo:sel].  "/ in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2837
"/                    selectors2 := selectors reject:[:sel | selectors1 includes:sel ].   "/ not in super
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2838
"/                ] ifFalse:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2839
"/                    selectors1 := selectors
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2840
"/                ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2841
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2842
"/                distances := selectors1 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2843
"/                distances sortWith:selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2844
"/                selectors1 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2845
"/                selectors := selectors1.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2846
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2847
"/                selectors2 notEmptyOrNil ifTrue:[
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2848
"/                    distances := selectors2 collect:[:each | each spellAgainst:selectorSoFar].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2849
"/                    distances sortWith:selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2850
"/                    selectors2 reverse.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2851
"/                    selectors1 := selectors1 collect:[:sel | sel allBold].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2852
"/                    selectors := selectors1,selectors2.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2853
"/                ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2854
"/
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2855
"/                best := self askUserForCompletion:'selector' for:codeView at:(node start) from:selectors.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2856
"/                best isNil ifTrue:[^ self].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2857
"/
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2858
"/                rest := best copyFrom:selectorSoFar size.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2859
"/                codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2860
"/                    undoableDo:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2861
"/                        codeView
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2862
"/                            replaceFromCharacterPosition:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2863
"/                            to:crsrPos+1
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2864
"/                            with:rest
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2865
"/                    ]
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2866
"/                    info:'Completion'.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2867
"/                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2868
"/            ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2869
"/            codeView cursorRight. "/ kludge to make it visible
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2870
"/        ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2871
"/    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2872
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2873
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2874
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2875
    "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
  2876
    "Modified: / 01-06-2012 / 20:31:36 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2877
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2878
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  2879
codeCompletionForMethodSpec:node into:actionBlock
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2880
    "completion in a method's selector pattern"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2881
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2882
    |crsrPos crsrLine crsrCol
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2883
     selectorSoFar matchingSelectors
5146
1bc2c5c6fc91 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 5143
diff changeset
  2884
     selectors allExistingMethods nameBag namesByCount 
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2885
     allSelectors
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2886
     selectorsForIsXXXTests selectorsSentInClass selectorsImplementedInSuper 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2887
     editAction editActionForArg argNames selectorsForVars
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2888
     selectorTypedSoFar addIfNotYetImplemented alreadyOK|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2889
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2890
    allSelectors := Set new.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2891
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  2892
    "/ Transcript showCR:'m'.
4370
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2893
    crsrLine := codeView cursorLine.
2569507c08b9 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4369
diff changeset
  2894
    crsrCol := codeView cursorCol.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2895
    crsrPos := codeView characterPositionOfCursor - 1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2896
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2897
    selectorTypedSoFar := node selector.
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2898
    selectorTypedSoFar isUnarySelector ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2899
        "/ user has just begun to edit a selector.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2900
        "/ 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
  2901
        classOrNil notNil ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2902
            selectorsForVars := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2903
            selectorsImplementedInSuper := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2904
            selectorsSentInClass := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2905
            selectorsForIsXXXTests := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2906
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2907
            addIfNotYetImplemented :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2908
                [:list :sel |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2909
                    sel ~= selectorTypedSoFar ifTrue:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2910
                        (allSelectors includes:sel) ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2911
                            (classOrNil implements:sel asSymbol) ifFalse:[ 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2912
                                selectorsForVars add:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2913
                                allSelectors add:sel.
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
                        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2916
                    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2917
                ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2918
                
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2919
            classOrNil instVarNames do:[:nm |
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2920
                (nm startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2921
                    addIfNotYetImplemented value:selectorsForVars value:nm.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2922
                    addIfNotYetImplemented value:selectorsForVars value:(nm,':').
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2923
                 ]
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2924
            ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2925
            classOrNil isMeta ifTrue:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2926
                classOrNil theNonMetaclass classVarNames do:[:nm |
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2927
                    |nmSel|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2928
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2929
                    nmSel := nm asLowercaseFirst.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2930
                    (nmSel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2931
                        addIfNotYetImplemented value:selectorsForVars value:nmSel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2932
                        addIfNotYetImplemented value:selectorsForVars value:(nmSel,':').
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2933
                    ]
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2934
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2935
            ] ifFalse:[
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2936
                "/ isXXX ?
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2937
                (('is',classOrNil nameWithoutPrefix) startsWith:selectorTypedSoFar ) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2938
                    addIfNotYetImplemented value:selectorsForIsXXXTests value:('is',classOrNil nameWithoutPrefix).
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2939
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2940
            ].
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2941
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2942
            "/ and also messages sent by the class itself
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2943
            classOrNil methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2944
                m messagesSentToSelf do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2945
                    (sel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2946
                        addIfNotYetImplemented value:selectorsSentInClass value:sel.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2947
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2948
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2949
            ].
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2950
            classOrNil isMeta ifFalse:[
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2951
                classOrNil theMetaclass methodsDo:[:m |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2952
                    m messagesSent do:[:sel |
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2953
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2954
                            addIfNotYetImplemented value:selectorsSentInClass value:sel.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2955
                        ]                     
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2956
                    ]                     
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2957
                ]
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
            "/ and also messages implemented by superclasses (except Object)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2960
            classOrNil allSuperclassesDo:[:eachSuperclass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2961
                eachSuperclass ~~ Object ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2962
                    eachSuperclass methodDictionary keysDo:[:sel |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2963
                        (sel startsWith:selectorTypedSoFar) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2964
                            addIfNotYetImplemented value:selectorsImplementedInSuper value:sel.
4691
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2965
                        ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2966
                    ]                     
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2967
                ]
b8baa7c905ef class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4689
diff changeset
  2968
            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2969
        ].
4371
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  2970
    ].
95c3d2ba35d5 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4370
diff changeset
  2971
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2972
    selectorSoFar := ''.
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2973
    matchingSelectors := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2974
    
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  2975
    node selectorParts doWithIndex:[:partToken :argNr|
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2976
        |part|
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2977
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2978
        part := partToken value.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2979
        selectorSoFar := selectorSoFar , part.
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2980
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2981
        (crsrPos >= partToken start 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2982
            and:[crsrPos <= partToken stop
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2983
                 or:[ (crsrPos == (partToken stop+1))
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2984
                      and:[codeView characterBeforeCursor == Character space]] ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2985
        ) ifTrue:[
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2986
            (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2987
                Smalltalk 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2988
                    allClassesDo:[:eachClass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2989
                        |md|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2990
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2991
                        md := eachClass theMetaclass methodDictionary.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2992
                        matchingSelectors addAll:(md keys 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2993
                                                    select:[:sel |sel startsWith:selectorSoFar]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2994
                    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2995
                "/ do not forget the stuff in the class-line
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2996
                Metaclass withAllSuperclassesDo:[:cls |
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2997
                    matchingSelectors addAll:(cls methodDictionary keys 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  2998
                                                select:[:sel |sel startsWith:selectorSoFar]).
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  2999
                ].
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3000
            ] ifFalse:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3001
                Smalltalk 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3002
                    allClassesDo:[:eachClass |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3003
                        |md|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3004
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3005
                        md := eachClass theNonMetaclass methodDictionary.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3006
                        matchingSelectors addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3007
                    ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3008
            ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3009
        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3010
    ].  
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3011
    alreadyOK := matchingSelectors includes:selectorTypedSoFar.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3012
    matchingSelectors remove:selectorTypedSoFar ifAbsent:[].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3013
    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3014
    selectors := Set new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3015
    selectors addAll:matchingSelectors.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3016
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3017
    selectorsForVars notNil ifTrue:[ selectors addAll:selectorsForVars ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3018
    selectorsSentInClass notNil ifTrue:[ selectors addAll:selectorsSentInClass ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3019
    selectorsImplementedInSuper notNil ifTrue:[ selectors addAll:selectorsImplementedInSuper ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3020
    selectorsForIsXXXTests notNil ifTrue:[ selectors addAll:selectorsForIsXXXTests ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3021
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3022
    selectors := selectors asOrderedCollection.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3023
    selectors sort:[:a :b | a size < b size].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3024
    selectorsForVars notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3025
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3026
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3027
                        by:[:sel | selectorsForVars includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3028
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3029
    selectorsSentInClass notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3030
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3031
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3032
                        by:[:sel | selectorsSentInClass includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3033
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3034
    selectorsImplementedInSuper notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3035
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3036
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3037
                        by:[:sel | selectorsImplementedInSuper includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3038
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3039
    selectorsForIsXXXTests notEmptyOrNil ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3040
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3041
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3042
                        by:[:sel | selectorsForIsXXXTests includes:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3043
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3044
    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3045
    selectors size > 100 ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3046
        selectors := selectors copyTo:100.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3047
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3048
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3049
    "/ 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
  3050
    "/ he might want to complete the argument-name
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3051
    (alreadyOK and:[selectorSoFar numArgs > 0]) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3052
        allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3053
                                    collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3054
        nameBag := Bag new.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3055
        allExistingMethods do:[:eachMethod | nameBag addAll:(eachMethod methodArgNames ? #())].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3056
        namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3057
        namesByCount := namesByCount copyToMax:5.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3058
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3059
        "/ take the one which occurs most often
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3060
        argNames := (namesByCount collect:[:a | a key]).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3061
        argNames do:[:eachArgName |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3062
            selectors add:('%1 %2 %3' 
5089
9592bdeeff69 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5086
diff changeset
  3063
                            bindWith:(selectorSoFar withColor:Color darkGrey) 
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3064
                            with:eachArgName
5089
9592bdeeff69 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5086
diff changeset
  3065
                            with:('(argument)' allItalic withColor:Color darkGrey)).
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3066
        ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3067
        
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3068
        editActionForArg :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3069
                [:chosenItem |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3070
                    |chosenName|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3071
                    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3072
                    chosenName := chosenItem 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3073
                                    copyFrom:(selectorSoFar size+2)
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3074
                                    to:(chosenItem indexOfSeparatorStartingAt:selectorSoFar size+2)-1.
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3075
                    codeView
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3076
                        undoableDo:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3077
                            (crsrPos+1) >= codeView contents size ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3078
                                codeView paste:chosenName.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3079
                                codeView cursorToCharacterPosition:(crsrPos + chosenName size - 1).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3080
                            ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3081
                                codeView cursorToCharacterPosition:crsrPos.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3082
                                codeView cursorRight.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3083
                                codeView insertStringAtCursor:chosenName.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3084
                                codeView selectFromCharacterPosition:crsrPos+1 to:crsrPos+1+chosenName size-1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3085
                                codeView dontReplaceSelectionOnInput
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3086
                            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3087
                        ]
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3088
                        info:'argname completion'.
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3089
                ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3090
    ].            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3091
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3092
    "/ no, still more possibilities for the selector.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3093
    "/ the ones implemented in superclasses are shown first.
5146
1bc2c5c6fc91 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 5143
diff changeset
  3094
    (classOrNil notNil and:[classOrNil superclass notNil]) ifTrue:[
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3095
        selectors := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3096
                        splitSelectorList:selectors 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3097
                        by:[:sel | classOrNil superclass implements:sel].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3098
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3099
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3100
"/"/    distances := selectors collect:[:each | each spellAgainst:selectorSoFar].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3101
"/"/    distances sortWith:selectors.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3102
"/"/    selectors reverse.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3103
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3104
    editAction :=
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3105
        [:selectedCompletionIndex |
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3106
            |chosen rest|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3107
            
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3108
            chosen := selectors at:selectedCompletionIndex.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3109
            (editActionForArg notNil and:[ chosen includesSeparator ]) ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3110
                editActionForArg value:chosen.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3111
            ] ifFalse:[    
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3112
                rest := chosen copyFrom:selectorSoFar size + 1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3113
                codeView
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3114
                    undoableDo:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3115
                        codeView insertString:rest atLine:crsrLine col:crsrCol.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3116
                    ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3117
                    info:'Completion'.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3118
                codeView cursorToCharacterPosition:(crsrPos+1 + rest size - 1).
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3119
                codeView cursorRight. "/ kludge to make it visible
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3120
            ].
4618
e2085d943570 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4615
diff changeset
  3121
        ].
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3122
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3123
    actionBlock
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3124
        value:selectors
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3125
        value:editAction
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  3126
        value:'selector'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3127
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3128
    "Modified: / 04-07-2006 / 18:48:26 / fm"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3129
    "Created: / 10-11-2006 / 13:46:44 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3130
    "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
  3131
    "Modified: / 01-06-2012 / 20:31:36 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3132
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3133
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3134
codeCompletionForTempVariable:node into:actionBlock
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3135
!
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  3136
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3137
codeCompletionForVariable:node into:actionBlock
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3138
    |nonMetaClass crsrPos nm parent
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3139
     allVariables allDistances variablesAlreadyAdded nodeVal
5081
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3140
     char getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3141
     globalFactor localFactor selectorOfMessageToNode implementors argIdx namesUsed kwPart editActions suggestions nameIsOK longerNames setOfNames otherArgNames
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3142
     suggestionsWithInfo isLeftSideOfAssignment|
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3143
 
4302
f115f2ff999d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4301
diff changeset
  3144
    "/ Transcript show:'var in '; show:methodOrNil; show:' / '; showCR:classOrNil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3145
    classOrNil notNil ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3146
        nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3147
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3148
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3149
    nm := node name.
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3150
    parent := node parent.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3151
    isLeftSideOfAssignment := false.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3152
    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3153
    (parent notNil) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3154
        (parent isMessage) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3155
            node == parent receiver ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3156
                selectorOfMessageToNode := parent selector
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3157
            ]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3158
        ] ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3159
            (parent isAssignment) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3160
                isLeftSideOfAssignment := (node == node parent variable).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3161
            ].    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3162
        ].    
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3163
    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3164
                    
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3165
    crsrPos := codeView characterPositionOfCursor.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3166
 
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3167
    "/ 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
  3168
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3169
    "/ 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
  3170
    char := codeView characterBeforeCursor. 
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3171
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3172
    (isLeftSideOfAssignment not and:[char == Character space]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3173
        nm knownAsSymbol ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3174
            classOrNil isNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3175
                nodeVal := Smalltalk at:nm asSymbol.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3176
            ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3177
                nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3178
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3179
            nodeVal isBehavior ifTrue:[
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3180
                |selectors selectors1 selectors2|
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3181
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3182
                selectors1 := OrderedSet new.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3183
                selectors2 := OrderedSet new.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3184
                nodeVal class 
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3185
                    withAllSuperclassesDo:[:cls |
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3186
                        cls methodDictionary keysAndValuesDo:[:sel :mthd |
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3187
                            |cat|
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3188
                            cat := mthd category asLowercase.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3189
                            cat = 'instance creation' ifTrue:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3190
                                selectors1 add:sel
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3191
                            ] ifFalse:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3192
                                "/ other category: look if it sends new, new: etc.
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3193
                                (mthd messagesSent includesAny:#(new new: basicNew basicNew:)) ifTrue:[
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3194
                                    selectors2 add:sel
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3195
                                ].    
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3196
                            ]
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3197
                        ]
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3198
                    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3199
 
4954
5224a5211ae5 #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4951
diff changeset
  3200
                selectors := selectors1 order sort , #('-') , selectors2 order sort.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3201
                editActions := selectors collect:[:word | self editActionToInsert:word].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3202
                actionBlock value:selectors value:editActions value:nil.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3203
"/                editAction :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3204
"/                    [:answer |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3205
"/                        |s|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3206
"/                        s := answer isInteger ifTrue:[selectors at:answer] ifFalse:[answer].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3207
"/                        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3208
"/                            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3209
"/                                codeView insertString:s atCharacterPosition:crsrPos.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3210
"/                                codeView cursorToCharacterPosition:crsrPos+s size.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3211
"/                            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3212
"/                            info:'completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3213
"/                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3214
"/                actionBlock value:selectors value:editAction value:nil.
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3215
                ^ self.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3216
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3217
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3218
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3219
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3220
    "/ this is pure voodoo magic (tries to make a good spelling weight,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3221
    "/ by weighting the number of startsWith characters into the spelling distance...)
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3222
    getDistanceComputeBlockWithWeight :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3223
        [:weight |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3224
            [:each |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3225
                |dist factor|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3226
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3227
                dist := each spellAgainst:nm.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3228
                factor := 1.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3229
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3230
                "/ bump the weight-factor if the name string is included
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3231
                (each includesString:nm) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3232
                    (each startsWith:nm) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3233
                        factor := 6 * weight * nm size.
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3234
                    ] ifFalse:[ 
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3235
                        (each endsWith:nm) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3236
                            factor := 5 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3237
                        ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3238
                            nm size > 1 ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3239
                                factor := 4 * weight * nm size
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3240
                            ].    
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3241
                        ].    
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3242
                    ].    
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3243
                ] ifFalse:[
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3244
                    (each includesString:nm caseSensitive:false) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3245
                        (each asLowercase startsWith:nm asLowercase) ifTrue:[
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3246
                            factor := 4 * weight * nm size.
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3247
                        ] ifFalse:[
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3248
                            (each asLowercase endsWith:nm asLowercase) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3249
                                factor := 3 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3250
                            ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3251
                                nm size > 1 ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3252
                                    factor := 2 * weight * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3253
                                ]
5027
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3254
                            ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3255
                        ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3256
                    ]
e7feddec2933 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  3257
                ].    
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3258
                dist := dist + (weight*factor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3259
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3260
                each -> (dist * weight)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3261
             ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3262
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3263
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3264
    nameIsOK := false.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3265
    addWithFactorBlock :=
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3266
        [:eachNames :factor |
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3267
            |distanceComputeBlock|
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3268
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3269
            distanceComputeBlock := (getDistanceComputeBlockWithWeight value:factor).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3270
            eachNames do:[:nameToAdd |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3271
                (nameToAdd = nm) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3272
                    nameIsOK := true
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3273
                ] ifFalse:[ "/ not again
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3274
                    (variablesAlreadyAdded includes:nameToAdd) ifFalse:[  "/ not again
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3275
                        variablesAlreadyAdded add:nameToAdd.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3276
                        allVariables add:nameToAdd.
4689
2e20580b6878 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4665
diff changeset
  3277
                        allDistances add:(distanceComputeBlock value:nameToAdd).
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3278
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3279
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3280
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3281
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3282
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3283
    nm isUppercaseFirst ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3284
        globalFactor := 2.    "/ favour globals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3285
        localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3286
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3287
        globalFactor := 1.    "/ favour locals
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3288
        localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3289
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3290
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3291
    variablesAlreadyAdded := Set new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3292
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3293
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3294
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3295
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3296
    (parent notNil
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3297
    and:[parent isMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3298
    and:[parent arguments includes:node]]) ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3299
        "/ yes -
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3300
        "/ 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
  3301
        "/ of this method, and take that as a basis of the selection
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
        implementors := SystemBrowser
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3304
                            findImplementorsOf:(parent selector)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3305
                            in:(Smalltalk allClasses)
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3306
                            ignoreCase:false.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3307
        "/ which argument is it
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3308
        argIdx := parent arguments indexOf:node.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3309
        implementors size > 50 ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3310
            implementors := implementors asOrderedCollection copyTo:50.
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
        namesUsed := implementors
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3313
                        collect:[:eachImplementor |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3314
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3315
                            parseTree := eachImplementor parseTree.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3316
                            (parseTree notNil and:[parseTree arguments size > 0])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3317
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3318
                                ifTrue:[ (parseTree arguments at:argIdx) name] ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3319
                        thenSelect:[:a | a notNil].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3320
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3321
        addWithFactorBlock value:namesUsed value:(2 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3322
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3323
        "/ try some commonly used arg names, such as aBoolean, anInteger, etc.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3324
        nm size > 1 ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3325
            |tryClassNamesWith|
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3326
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3327
            ((nm startsWith:'a') and:[(nm at:2) isUppercase]) ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3328
                tryClassNamesWith := 'a'
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3329
            ] ifFalse:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3330
                (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
  3331
                    tryClassNamesWith := 'an'.
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3332
                ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3333
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3334
            tryClassNamesWith notNil ifTrue:[
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3335
                addWithFactorBlock 
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3336
                    value:(Smalltalk keys 
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3337
                            collect:[:className | tryClassNamesWith,className]
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3338
                            thenSelect:[:name | name startsWith:nm])
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3339
                    value:(1.5 * localFactor)
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3340
            ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3341
        ].
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  3342
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3343
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3344
            "/ also, look for the keyword before the argument,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3345
            "/ and see if there is such an instVar
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3346
            "/ if so, add it with -Arg
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3347
            parent selector isKeyword ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3348
                kwPart := parent selector keywords at:argIdx.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3349
                (classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3350
                    addWithFactorBlock
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3351
                        value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3352
                        value:(1 * localFactor).
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
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3355
            "/ look for the variable names of any other method in that class
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3356
            otherArgNames := Set new.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3357
            classOrNil methodDictionary keysAndValuesDo:[:sel :mthd |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3358
                            |parseTree|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3359
                            parseTree := mthd parseTree.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3360
                            (parseTree notNil and:[parseTree arguments size > 0])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3361
                                ifFalse:nil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3362
                                ifTrue:[ otherArgNames addAll:(parseTree arguments collect:[:each | each name])] ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3363
            addWithFactorBlock value:otherArgNames value:(1.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3364
        ].
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3365
        addWithFactorBlock 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3366
            value:(codeView previousReplacements 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3367
                                    collect:[:p | p value asString]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3368
                                    thenSelect:[:s | s isValidSmalltalkIdentifier]) 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  3369
            value:(1.3 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3370
    ] ifFalse:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3371
        "/ locals in the block/method
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3372
        |names nameSpace|
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3373
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3374
        names := OrderedCollection withAll:node allVariablesOnScope.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3375
        setOfNames := Set withAll:names.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3376
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3377
        rememberedScopeNodes notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3378
            "/ notNil when a parseError occurred.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3379
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3380
                (eachScope isMethod or:[eachScope isBlock]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3381
                    eachScope argumentNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3382
                        (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
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
                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3385
                    eachScope isSequence ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3386
                        eachScope temporaryNames do:[:eachName |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3387
                            (setOfNames includes:eachName) ifFalse:[ names add:eachName. setOfNames add:eachName ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3388
                        ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3389
                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3390
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3391
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3392
                "/ (setOfNames includesAll:(eachScope allDefinedVariables)) ifFalse:[ self halt].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3393
            ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3394
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3395
            rememberedScopeNodes do:[:eachScope |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3396
                eachScope variableNodesDo:[:var |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3397
                    (setOfNames includes:var name) ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3398
                        names add:var name. setOfNames add:var name
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3399
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3400
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3401
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3402
        ] ifFalse:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3403
            "/ 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
  3404
            "/ (further down the code), add them also
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3405
            tree variableNodesDo:[:var |
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3406
                |name|
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
                name := var name.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3409
                (name first isLowercase or:[isLeftSideOfAssignment not]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3410
                    (setOfNames includes:name) ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3411
                        names add:name. 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3412
                        setOfNames add:name
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3413
                    ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3414
                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3415
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3416
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3417
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3418
        addWithFactorBlock value:names value:(4 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3419
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3420
        classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3421
            "/ instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3422
            addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3423
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3424
            "/ inherited instance variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3425
            classOrNil superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3426
                addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3427
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3428
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3429
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3430
        "/ magic:
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3431
        "/ 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
  3432
        "/ give names which respond to those messages a higher weight
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3433
        selectorOfMessageToNode notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3434
            |responders nonResponders|
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3435
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3436
            "/ responding to that messsage
4365
fda4ed5a9772 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4364
diff changeset
  3437
"/ self halt.
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3438
            classOrNil notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3439
                "/ private classes
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3440
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3441
                                   value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3442
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3443
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3444
                names := nonMetaClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3445
                responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3446
                nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3447
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3448
                addWithFactorBlock value:responders value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3449
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3450
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3451
                "/ superclass var names
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3452
                nonMetaClass allSuperclassesDo:[:superClass |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3453
                    names := superClass classVarNames.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3454
                    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3455
                    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3456
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3457
                    addWithFactorBlock value:responders value:(2.75 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3458
                    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3459
                ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3460
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3461
                isLeftSideOfAssignment ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3462
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3463
                    classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3464
                        names := classOrNil topNameSpace keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3465
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3466
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3467
                        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
  3468
                        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
  3469
                        addWithFactorBlock value:responders value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3470
                        addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3471
                    ].
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
            ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3474
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3475
            isLeftSideOfAssignment ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3476
                "/ globals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3477
                names := Smalltalk keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3478
                names := names reject:
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3479
                                [:nm |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3480
                                    (nm includes:$:) and:[ (Smalltalk at:nm) isBehavior not]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3481
                                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3482
                names := names reject:[:nm | nm startsWith:'Undeclared:::' ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3483
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3484
                names := names select:[:nm | nm isUppercaseFirst ] as:OrderedCollection.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3485
                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
  3486
                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
  3487
                addWithFactorBlock value:responders value:(1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3488
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3489
            ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3490
            
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3491
            isLeftSideOfAssignment ifFalse:[ "/ no, we will not suggest assigning to pool vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3492
                classOrNil notNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3493
                    "/ pool variables
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3494
                    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3495
                        |pool names|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3496
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3497
                        pool := Smalltalk at:poolName.
5224
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3498
                        pool notNil ifTrue:[
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3499
                            names := pool classVarNames.
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3500
                            names := names select:[:nm | nm isUppercaseFirst ].
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3501
                            responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3502
                            nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3503
                            addWithFactorBlock value:responders value:(2.5 * globalFactor).
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3504
                            addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
941b9aba81cc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5203
diff changeset
  3505
                        ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3506
                    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3507
                ]
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3508
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3509
        ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3510
            classOrNil notNil ifTrue:[
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3511
                isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3512
                    "/ private classes
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3513
                    addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3514
                                       value:(2.75 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3515
                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3516
                
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3517
                "/ class variables
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3518
                addWithFactorBlock value:nonMetaClass classVarNames value:(3.0 * globalFactor).
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3519
                nonMetaClass superclass notNil ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3520
                    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.5 * globalFactor).
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
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3523
                isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3524
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3525
                    classOrNil topNameSpace ~~ Smalltalk ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3526
                        names := classOrNil topNameSpace keys.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3527
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3528
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3529
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3530
                    ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3531
                    "/ namespace vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3532
                    ((nameSpace := classOrNil nameSpace) notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3533
                        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
  3534
                        names := names select:[:nm | nm isUppercaseFirst ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3535
                        names := names reject:[:nm | nm includes:$:].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3536
                        addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3537
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3538
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3539
                isLeftSideOfAssignment ifFalse:[ "/ no, we will not suggest assigning to pool vars
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3540
                    "/ pool variables
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3541
                    classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3542
                        |pool names|
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3543
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3544
                        pool := Smalltalk at:poolName.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3545
                        pool isNil ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3546
                            Transcript showCR:'non existent pool: ',poolName
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3547
                        ] ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3548
                            names := pool classVarNames.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3549
                            addWithFactorBlock value:names value:(2.5 * globalFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3550
                        ]
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3551
                    ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3552
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3553
            ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3554
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3555
            isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3556
                "/ globals
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3557
                names := OrderedCollection new.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3558
                Smalltalk keysDo:[:k |
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3559
                    (k isUppercaseFirst
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3560
                    and:[ (k startsWith:'Undeclared:::') not
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3561
                    and:[ ((k includes:$:) and:[ (k includesString:'::') not]) not ]]) ifTrue:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3562
                        names add:k
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3563
                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3564
                ].
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3565
            
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3566
                "/ 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
  3567
                "/ otherwise, only consider names with a caseInsensitve prefix match
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3568
                nm first isUppercase ifFalse:[
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3569
                    names := names select:[:globalName | globalName asLowercase startsWith: nm].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3570
                ].
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3571
                addWithFactorBlock value:names value:(1.5 * globalFactor).
4665
260b9fd17388 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4620
diff changeset
  3572
            ].
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3573
        ].
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3574
5076
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3575
        isLeftSideOfAssignment ifFalse:[ 
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3576
            "/ pseudos - assuming that thisContext is seldom used.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3577
            "/ also assuming, that nil is short so its usually typed in.
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3578
            addWithFactorBlock value:#('self') value:(2.5 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3579
            addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3580
            addWithFactorBlock value:#('super' 'false' 'true') value:(2 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3581
            addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
9d8cf635a6cb #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5075
diff changeset
  3582
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3583
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3584
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3585
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3586
4410
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3587
"/ nope (foo := foo + 1) should be possible!!
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3588
"/    (parent notNil and:[parent isAssignment]) ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3589
"/        "/ remove the left side of the assignment (to avoid foo := foo suggestions)
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3590
"/        |i|
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3591
"/
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3592
"/        i := allDistances findFirst:[:entry | entry key = parent variable name].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3593
"/        i ~~ 0 ifTrue:[
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3594
"/            allDistances removeAtIndex:i
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3595
"/        ].
bee334ff01be class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4409
diff changeset
  3596
"/    ].
4385
d3381caeb327 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4382
diff changeset
  3597
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3598
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3599
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3600
                                                           ifTrue:[el]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3601
                                                           ifFalse:[best]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3602
                                                    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3603
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3604
    allDistances sort:[:a :b |
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3605
                                a value > b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3606
                                    true
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3607
                                ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3608
                                    a value = b value ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3609
                                        a key < b key
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3610
                                    ] ifFalse:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3611
                                        false
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3612
                                    ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3613
                                ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3614
                      ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3615
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3616
    allTheBest := allDistances.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3617
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3618
    nameIsOK ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3619
        "/ if the name already exists, only allow longer names, if there are
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  3620
        longerNames := allTheBest select:[:assoc | (assoc key startsWith:nm) or:[assoc key endsWith:nm]].
5033
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3621
        longerNames size < 30 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3622
            longerNames := allTheBest select:[:assoc | assoc key includesString:nm caseSensitive:false].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3623
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3624
        longerNames isEmpty ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3625
            "/ no better name
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3626
            ^ self
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3627
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3628
        allTheBest := longerNames.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3629
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3630
5033
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3631
    allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3632
        allTheBest := allTheBest copyTo:20.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3633
"/        "/ 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
  3634
"/        0.2 to:0.9 by:0.1 do:[:delta |
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3635
"/            |bestValue n|
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3636
"/            
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3637
"/            "/ if still too many, remove more and more
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3638
"/            allTheBest size > 50 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3639
"/                bestValue := bestAssoc value * delta.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3640
"/                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
  3641
"/                n size >= 15 ifTrue:[ allTheBest := n ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3642
"/            ]
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3643
"/        ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3644
"/        allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3645
"/            "/ remove all those which are below some threshold
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3646
"/            0.2 to:0.9 by:0.1 do:[:delta |
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3647
"/                |bestValue n|
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3648
"/                "/ if still too many, remove more and more
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3649
"/                allTheBest size > 20 ifTrue:[
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3650
"/                    bestValue := bestAssoc value * delta.
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3651
"/                    allTheBest := allTheBest select:[:entry | entry value >= bestValue ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3652
"/                ]
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3653
"/            ].
743f882894d9 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5031
diff changeset
  3654
"/        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3655
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3656
    suggestions := allTheBest collect:[:assoc | assoc key].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3657
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3658
    "/ finally, the trick is to bring them into a reasonable order...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3659
    "/ sort the prefix matchers by length, the others by spelling distance
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3660
    "/ and bring the prefix-matchers towards the beginning
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3661
    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
  3662
                   ,
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3663
                   (suggestions reject:[:s | s startsWith:nm]).
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3664
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3665
    "/ if super is among them, add a full call to the completions
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3666
    (suggestions includes:'super') ifTrue:[
4559
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3667
        (tree notNil
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3668
        and:[ tree isMethod ]) ifTrue:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3669
            Error handle:[:ex |
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3670
                Transcript showCR:'parse error in code completion ignored'.
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3671
            ] do:[
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3672
                suggestions addFirst:('super ',(Parser methodSpecificationForSelector:tree selector argNames:(tree argumentNames)),'.').
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3673
            ]
9a51a38177e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4548
diff changeset
  3674
        ].
4417
a523d812f6c1 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4416
diff changeset
  3675
    ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3676
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3677
    suggestionsWithInfo := 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3678
        suggestions 
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3679
            collect:[:eachName |
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3680
                |val kind valAndKind printString|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3681
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3682
                valAndKind := self valueAndKindOfVariable:eachName.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3683
                valAndKind isNil ifTrue:[
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3684
                    eachName
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3685
                ] ifFalse:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3686
                    val := valAndKind first.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3687
                    kind := valAndKind second.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3688
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3689
                    val isBehavior ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3690
                        val isLoaded ifFalse:[
5090
c68614848447 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5089
diff changeset
  3691
                            eachName,' (= ', ('autoloaded class in ',(val category ? 'unknown category')) allItalic,' )'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3692
                        ] ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3693
                            val isNameSpace ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3694
                                eachName,' ( ', 'namespace' allItalic,' )'
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3695
                            ] ifFalse:[
5090
c68614848447 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5089
diff changeset
  3696
                                eachName,' (= ', ('class in ',(val category ? 'unknown category')) allItalic,' )'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3697
                            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3698
                        ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3699
                    ] ifFalse:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3700
                        "/ Parser findBest:30 selectorsFor:'isLite' in:nil forCompletion:true
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3701
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3702
                        (val isLiteral and:[ (printString := val printString) size < 15 ]) ifTrue:[
5090
c68614848447 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5089
diff changeset
  3703
                            eachName,' (= ',printString allItalic,' )'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3704
                        ] ifFalse:[
5370
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  3705
                            eachName,' (= ',val class nameWithArticle allItalic,' )'
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3706
                        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3707
                    ].
4620
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3708
                ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3709
            ].
3ee4c981e385 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4619
diff changeset
  3710
5081
5478311e8ee5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5080
diff changeset
  3711
    editActions := suggestions collect:[:word |
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3712
                     self editActionToReplaceNode:node by:word.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3713
                   ].        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3714
    actionBlock value:suggestionsWithInfo value:editActions value:nil.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3715
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3716
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3717
    "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
  3718
    "Modified: / 01-05-2016 / 18:45:07 / cg"
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3719
!
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3720
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3721
editActionToInsert:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3722
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3723
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3724
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3725
                codeView insertSelectedStringAtCursor:aString.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3726
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3727
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3728
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3729
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3730
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3731
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3732
editActionToInsertFromSuggestions:suggestions
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3733
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3734
        |answer|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3735
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3736
        answer := suggestions at:index.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3737
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3738
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3739
                codeView insertSelectedStringAtCursor:answer.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3740
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3741
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3742
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3743
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3744
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3745
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3746
editActionToReplaceCodeFrom:start to:stop by:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3747
    ^ [:index |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3748
        |oldVar oldLen newLen insertWithSpace|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3749
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3750
        insertWithSpace := false.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3751
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3752
        start <= stop ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3753
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3754
        ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3755
            codeView characterBeforeCursor == Character space ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3756
                insertWithSpace := true.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3757
            ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3758
        ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3759
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3760
        oldLen := stop - start + 1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3761
        newLen := aString size.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3762
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3763
        codeView
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3764
            undoableDo:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3765
                insertWithSpace ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3766
                    codeView insertSelectedStringAtCursor:aString
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3767
                ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3768
                    codeView replaceFromCharacterPosition:start to:stop with:aString.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3769
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3770
                    (aString startsWith:oldVar) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3771
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3772
                    ] ifFalse:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3773
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3774
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3775
                ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3776
                codeView dontReplaceSelectionOnInput
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3777
            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3778
            info:'Completion'.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3779
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3780
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3781
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3782
    "Created: / 01-05-2016 / 18:47:40 / cg"
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3783
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3784
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3785
editActionToReplaceCodeFrom:start to:stop byWordIn:suggestions
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3786
    ^ [:index |
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3787
        |answer oldVar oldLen newLen insertWithSpace|
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3788
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3789
        insertWithSpace := false.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3790
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3791
        answer := suggestions at:index.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3792
        start <= stop ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3793
            oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3794
        ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3795
            codeView characterBeforeCursor == Character space ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3796
                insertWithSpace := true.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3797
            ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3798
        ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3799
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3800
        oldLen := stop - start + 1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3801
        newLen := answer size.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3802
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3803
        codeView
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3804
            undoableDo:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3805
                insertWithSpace ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3806
                    codeView insertSelectedStringAtCursor:answer
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3807
                ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3808
                    codeView replaceFromCharacterPosition:start to:stop with:answer.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3809
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3810
                    (answer startsWith:oldVar) ifTrue:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3811
                        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3812
                    ] ifFalse:[
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3813
                        codeView selectFromCharacterPosition:start to:start+newLen-1.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3814
                    ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3815
                ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3816
                codeView dontReplaceSelectionOnInput
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3817
            ]
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3818
            info:'Completion'.
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3819
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3820
    ].
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3821
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3822
    "Created: / 01-05-2016 / 18:47:40 / cg"
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3823
!
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3824
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3825
editActionToReplaceNode:node by:word
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3826
    ^ self editActionToReplaceCodeFrom:node start to:node stop by:word
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3827
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3828
    "Created: / 01-05-2016 / 18:44:09 / cg"
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3829
!
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  3830
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3831
editActionToReplaceNode:node byWordIn:suggestions
5114
856f583b1fff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5113
diff changeset
  3832
    ^ self editActionToReplaceCodeFrom:(node start) to:(node stop) byWordIn:suggestions
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3833
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  3834
    "Created: / 01-05-2016 / 18:44:09 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3835
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3836
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3837
findBest:node for:selector inClasses:srchClassesArg
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3838
    |srchClasses bestSelectors
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3839
     allMessagesSentToVariable classesImplementingAllMessages|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3840
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3841
    srchClasses := srchClassesArg.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3842
    Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3843
        Transcript show:'node: '; showCR:node.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3844
        Transcript show:'srchClasses: '; showCR:srchClasses.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3845
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3846
    
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3847
    srchClasses isEmptyOrNil ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3848
        node isVariable ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3849
            allMessagesSentToVariable := Set new.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3850
            rememberedNodes do:[:eachNode |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3851
                eachNode allMessageNodesDo:[:eachMessage |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3852
                    |msgReceiver msgSelector|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3853
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3854
                    (msgReceiver := eachMessage receiver) isVariable ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3855
                        msgReceiver name = node name ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3856
                            (msgSelector := eachMessage selector) ~= selector ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3857
                                allMessagesSentToVariable add:msgSelector
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3858
                            ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3859
                        ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3860
                    ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3861
                ]
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3862
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3863
            allMessagesSentToVariable notEmpty ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3864
                "/ consider classes which implement all those messages.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3865
                classesImplementingAllMessages := Smalltalk allImplementorsOf:(allMessagesSentToVariable first).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3866
                allMessagesSentToVariable do:[:eachSelector |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3867
                    classesImplementingAllMessages := classesImplementingAllMessages
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3868
                                                        select:[:cls | cls implements:eachSelector].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3869
                ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3870
                srchClasses := classesImplementingAllMessages.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3871
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3872
        ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3873
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3874
    bestSelectors := Set new.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3875
    srchClasses isEmptyOrNil ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3876
        bestSelectors addAll:( Parser findBest:50 selectorsFor:selector in:nil forCompletion:true ).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3877
        Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3878
            Transcript show:'bestSelectors (1): '; showCR:bestSelectors.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3879
        ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3880
    ] ifFalse:[    
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3881
        srchClasses do:[:srchClass |
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3882
            |bestForThisClass|
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3883
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3884
            bestForThisClass := Parser findBest:50 selectorsFor:selector in:srchClass forCompletion:true.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3885
            bestForThisClass := self
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3886
                                withoutSelectorsUnlikelyFor:srchClass
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3887
                                from:bestForThisClass
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3888
                                forPartial:selector.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3889
            Verbose == true ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3890
                Transcript show:'bestSelectors (2): '; showCR:bestForThisClass.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3891
            ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3892
            bestSelectors addAll:bestForThisClass.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3893
        ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3894
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3895
    "/ remove the already typed-in selector itself, in case.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3896
    bestSelectors remove:selector ifAbsent:[].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3897
    bestSelectors := bestSelectors asOrderedCollection.
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3898
    ^ bestSelectors
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3899
!
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  3900
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3901
findNodeForInterval:interval in:source
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  3902
    ^ self class findNodeForInterval:interval in:source
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3903
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3904
    "Modified: / 06-07-2011 / 12:42:53 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3905
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3906
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3907
findNodeForInterval:interval in:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3908
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3909
	findNodeForInterval:interval in:source allowErrors:allowErrors
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3910
	mustBeMethod:false
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3911
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3912
    "Modified: / 16-09-2011 / 14:52:28 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3913
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3914
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3915
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3916
    "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
  3917
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3918
    ^ self
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3919
	findNodeForInterval:interval in:source allowErrors:allowErrors
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3920
	mustBeMethod:mustBeMethod mustBeExpression:false
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3921
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3922
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  3923
findNodeForInterval:interval in:source allowErrors:allowErrors mustBeMethod:mustBeMethod mustBeExpression:mustBeExpression
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3924
    "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
  3925
     (typically a selection or a word in the source).
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3926
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3927
     parse it as expression or method;
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3928
        if mustBeMethod is true, do not try as expression;
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3929
        if mustBeExpression is true, do not try as method
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3930
     expression syntax parsing is done in workspaces (doIt).
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3931
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3932
     Big hack as workaround a limitation of RBParser:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3933
     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
  3934
     (because the code is written as: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3935
        parentNode addChild:(self parseChild)
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3936
     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
  3937
     However:
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3938
        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
  3939
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3940
     Workaround:
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3941
        remember created nodes as the parse proceeds.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  3942
        Thus, I can construct a partial the parent chain.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3943
    "
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  3944
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3945
    |intersectingNodes smallestIntersectingNode firstIntersectingNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3946
     lastIntersectingNode onErrorBlock
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3947
     nodeGenerationHook parserClass parser currentScopeNodes bestNode|
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3948
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3949
    interval isEmpty ifTrue: [^ nil].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  3950
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3951
    languageOrNil notNil ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3952
        parserClass := languageOrNil parserClass.
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3953
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3954
        classOrNil notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3955
            parserClass := classOrNil programmingLanguage parserClass.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3956
        ]
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  3957
    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  3958
    parserClass notNil ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3959
        "/ hack
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3960
        parserClass == Parser ifTrue: [
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3961
            parserClass := RBParser.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3962
        ].
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3963
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3964
        parserClass := RBParser.
4373
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3965
    ].
93f9e6259b3a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4372
diff changeset
  3966
    parserClass isNil ifTrue: [^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3967
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  3968
    rememberedScopeNodes := nil.
4434
b15ce7d47dd8 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4433
diff changeset
  3969
    rememberedNodes := OrderedCollection new.
4361
88d1ef0ad830 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4358
diff changeset
  3970
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3971
    "/ LastSource := nil.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3972
    source = LastSource ifTrue:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3973
        tree := LastParseTree.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3974
        tokens := LastScanTokens.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  3975
    ] ifFalse:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3976
        intersectingNodes := OrderedCollection new.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3977
        currentScopeNodes := IdentitySet new.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3978
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3979
        onErrorBlock :=
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3980
            [:str :err :nodesSoFar |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3981
                |nodes|
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
                allowErrors ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3984
                    rememberedScopeNodes := currentScopeNodes.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3985
                    firstIntersectingNode notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3986
                        ^ firstIntersectingNode
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
                    nodesSoFar notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3989
                        nodes := nodesSoFar asOrderedCollection
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3990
                                    collect:[:nd | nd whichNodeIntersects:interval]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3991
                                    thenSelect:[:nd | nd notNil ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3992
                        nodes size == 1 ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3993
                            ^ nodes first
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3994
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3995
                    ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3996
                ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3997
                nil
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3998
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  3999
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4000
        self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4001
            Transcript show:'looking for: '; showCR:interval.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4002
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4003
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4004
        nodeGenerationHook :=
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4005
            [:node |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4006
                rememberedNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4007
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4008
                "/ 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
  4009
                "/ 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
  4010
                "/ what the semantic interpretation (especially: scope of variable) will be.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4011
                "/ therefore, we parse all, and return the found node at the end.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4012
                (node isMethod or:[node isBlock or:[node isSequence]]) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4013
                    currentScopeNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4014
                ] ifFalse:[
5075
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4015
"/                    self debuggingCodeFor:#cg is:[
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4016
"/                        node isMessage ifTrue:[
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4017
"/                            Transcript show:node; show:' '; show:node start; show:'->'; showCR:node stop.
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4018
"/                        ].
7158e4b9c2c0 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5074
diff changeset
  4019
"/                    ].
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4020
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4021
                    (node intersectsInterval:interval) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4022
                        self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4023
                            Transcript showCR:'yes'.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4024
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4025
                        intersectingNodes add:node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4026
                        firstIntersectingNode isNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4027
                            firstIntersectingNode := lastIntersectingNode := smallestIntersectingNode := node
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4028
                        ] ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4029
                            |lenNode lenSmallest|
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4030
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4031
                            lenNode := (node stop - node start).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4032
                            lenSmallest := (smallestIntersectingNode stop - smallestIntersectingNode start).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4033
                            lenNode < lenSmallest ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4034
                                smallestIntersectingNode := node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4035
                            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4036
                            node start > lastIntersectingNode start ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4037
                                lastIntersectingNode := node.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4038
                            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4039
                        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4040
                    ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4041
                ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4042
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4043
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4044
        "/ one of the big problems when using the RBParser here is
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4045
        "/ that it behaves badly when a syntax error is encountered;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4046
        "/ 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
  4047
        "/ completely parsed (for example, a blockNode gets the parent-method only
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4048
        "/ after parsing). Thus, when an error is encountered, we cannot walk
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4049
        "/ 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
  4050
        "/ an inner scope (allVariablesOnScope returns only a partial set).
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4051
        "/ 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
  4052
        "/ 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
  4053
        "/ parent gets set eventually, thus we might consider locals from sibling blocks.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4054
        "/ See rememberedScopeNodes handling above.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4055
        "/ Those other nodes are only remembered for failed parses;
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4056
        "/ if the parse is ok, rememberedScopeNodes will be nil.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4057
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4058
        mustBeExpression ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4059
            tree := parserClass
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4060
                        parseMethod: source
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4061
                        setup:[:p |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4062
                            parser := p.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4063
                            p rememberNodes:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4064
                            p rememberTokens:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4065
                            p nodeGenerationCallback:nodeGenerationHook
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4066
                        ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4067
                        onError: onErrorBlock.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4068
            parser notNil ifTrue:[ tokens := parser rememberedTokens ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4069
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4070
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4071
        mustBeMethod ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4072
            "/ only cache parsed methods
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4073
            tree notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4074
                LastSource := source.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4075
                LastParseTree := tree.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4076
                LastScanTokens := tokens.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4077
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4078
        ] ifFalse:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4079
            (tree isNil or:[firstIntersectingNode isNil]) ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4080
                "/ try as an expression
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4081
                tree := parserClass
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4082
                            parseExpression: source
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4083
                            setup:[:p |
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4084
                                parser := p.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4085
                                p rememberNodes:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4086
                                p rememberTokens:true.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4087
                                p nodeGenerationCallback:nodeGenerationHook
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4088
                            ]
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4089
                            onError: onErrorBlock.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4090
                parser notNil ifTrue:[ tokens := parser rememberedTokens ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4091
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4092
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4093
        lastIntersectingNode notNil ifTrue:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4094
            self debuggingCodeFor:#cg is:[
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4095
                Transcript show:'last: '; showCR:lastIntersectingNode.
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4096
            ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4097
            ^ lastIntersectingNode
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4098
        ].
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4099
        "/ firstIntersectingNode notNil ifTrue:[ ^ firstIntersectingNode ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4100
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4101
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4102
    bestNode := self findNodeForInterval:interval inParseTree:tree.
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4103
    self debuggingCodeFor:#cg is:[
4934
9b2c18bd9e9c #UI_ENHANCEMENT
Claus Gittinger <cg@exept.de>
parents: 4933
diff changeset
  4104
        Transcript show:'best: '; showCR:bestNode.
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4105
    ].
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4106
    ^ bestNode
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4107
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4108
    "Created: / 16-09-2011 / 14:52:08 / cg"
4407
59eecb68b4fb class: DoWhatIMeanSupport
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4392
diff changeset
  4109
    "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
  4110
    "Modified (comment): / 01-05-2016 / 10:05:10 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4111
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4112
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4113
findNodeForInterval:interval inParseTree:parseTree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4114
    |node|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4115
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4116
    interval isEmpty ifTrue: [^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4117
    parseTree isNil ifTrue:[^ nil].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4118
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4119
    node := parseTree whichNodeIsContainedBy:interval.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4120
    node isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4121
	node := parseTree whichNodeIntersects:interval.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4122
	node isNil ifTrue: [
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4123
	    node := self findNodeIn:parseTree forInterval:interval
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4124
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4125
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4126
    ^ node
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4127
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4128
    "Modified: / 10-11-2006 / 13:13:58 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4129
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4130
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  4131
findNodeIn:aTree forInterval:anInterval
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  4132
    ^ self class findNodeIn:aTree forInterval:anInterval
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4133
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4134
    "Modified: / 20-11-2006 / 12:31:12 / cg"
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
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4137
insertAdditonalStuffAfterSelector:chosenCompletion
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4138
    |optionalExtraSpace|
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4139
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4140
    optionalExtraSpace := (codeView characterAfterCursor isSeparator)
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4141
                            ifTrue:['']
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4142
                            ifFalse:[' '].
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4143
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4144
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4145
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4146
            'ifTrue:' 'ifFalse:' 'ifTrue:ifFalse:' 'ifFalse:ifTrue:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4147
            'and:' 'or:' 'timesRepeat:' 'whileTrue:' 'whileFalse:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4148
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4149
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4150
        codeView insertStringAtCursor:('[',optionalExtraSpace,']').
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4151
        "/ codeView cursorLeft:1+extra size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4152
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4153
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4154
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4155
            'collect:' 'select:' 'reject:' 'do:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4156
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4157
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4158
        codeView insertStringAtCursor:('[:each | ]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4159
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4160
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4161
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4162
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4163
            'contains:' 'findFirst:' 'detect:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4164
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4165
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4166
        codeView insertStringAtCursor:('[:some | ]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4167
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4168
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4169
    (
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4170
        #(
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4171
            'remove:ifAbsent:' 'detect:ifNone:'
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4172
        ) includes:chosenCompletion
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4173
    ) ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4174
        codeView insertStringAtCursor:('[]',optionalExtraSpace).
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4175
        codeView cursorLeft:1+optionalExtraSpace size.
4421
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4176
    ].
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4177
!
adbde1681089 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4419
diff changeset
  4178
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4179
messagesSentTo:varName in:aTree
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4180
    |messagesToReceiver collector|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4181
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4182
    collector :=
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4183
        [:node | 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4184
            (node isMessage 
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4185
            and:[node receiver isVariable
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4186
            and:[node receiver name = varName]]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4187
                messagesToReceiver add:(node selector)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4188
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4189
        ].
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4190
        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4191
    "/ collect messages sent
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4192
    messagesToReceiver := Set new.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4193
    "/ remembered nodes is nonNil if parser aborted with error
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4194
    rememberedNodes notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4195
        rememberedNodes do:collector.
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4196
    ] ifFalse:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4197
        tree allMessageNodesDo:collector.
5043
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
    ^ messagesToReceiver
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4200
!
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4201
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4202
old_askUserForCompletion:what for:codeView from:allTheBest
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4203
    |list resources choice lastChoice|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4204
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4205
    allTheBest isEmpty ifTrue:[ ^ nil ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4206
    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4207
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4208
    list := allTheBest.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4209
    LastChoices notNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4210
	lastChoice := LastChoices at:what ifAbsent:nil.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4211
	lastChoice notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4212
	    "/ 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
  4213
	    (list includes: lastChoice) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4214
		(list indexOf: lastChoice) < 10 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4215
		    list := {lastChoice allBold } , (list copyWithout:lastChoice).
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4216
		]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4217
	    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4218
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4219
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4220
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4221
    list size < 30 ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4222
	|menu idx exitKey|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4223
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4224
	menu := PopUpMenu labels:list.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4225
	menu hideOnKeyFilter:[:key | |hide|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4226
		hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4227
		hide ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4228
		    exitKey := key.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4229
		].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4230
		hide].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4231
	menu memorizeLastSelection:3 "sigh, not 1 because of heading!!".
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4232
	idx := menu startUpWithHeading:'Choose ',what.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4233
	idx == 0 ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4234
	    exitKey notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4235
		codeView keyPress:exitKey x:0 y:0.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4236
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4237
	    ^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4238
	].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4239
	choice := list at:idx.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4240
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4241
	resources := codeView application isNil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4242
			ifTrue:[ codeView resources]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4243
			ifFalse:[ codeView application resources ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4244
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4245
	choice := Dialog
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4246
	   choose:(resources string:'Choose ',what)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4247
	   fromList:list
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4248
	   lines:20
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4249
	   initialSelection:(list firstIfEmpty:nil)
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4250
	   title:(resources string:'Code completion').
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4251
	choice isNil ifTrue:[^ nil].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4252
    ].
4301
90f7571df306 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4284
diff changeset
  4253
    choice := choice string.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4254
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4255
    LastChoices isNil ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4256
	LastChoices := Dictionary new.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4257
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4258
    LastChoices at:what put:choice.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4259
    ^ choice
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4260
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4261
    "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
  4262
    "Modified: / 28-08-2013 / 15:28:01 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4263
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4264
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4265
sortSelectors:list forSelector:selector lcSelector:lcSelector
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4266
    list sort: [:a :b |
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4267
        |aBeforeB|
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4268
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4269
        (a startsWith:selector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4270
            (b startsWith:selector) ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4271
                aBeforeB := true
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4272
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4273
        ] ifFalse:[    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4274
            (b startsWith:selector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4275
                aBeforeB := false
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4276
            ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4277
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4278
        aBeforeB isNil ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4279
            aBeforeB := a asLowercase < b asLowercase.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4280
            (a asLowercase startsWith:lcSelector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4281
                (b asLowercase startsWith:lcSelector) ifFalse:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4282
                    aBeforeB := true
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4283
                ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4284
            ] ifFalse:[    
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4285
                (b asLowercase startsWith:lcSelector) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4286
                    aBeforeB := false
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4287
                ]
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4288
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4289
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4290
        aBeforeB
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4291
    ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4292
!
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4293
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4294
sortUsefulSelectorsIn:selectorList
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4295
    "/ cosmetics: 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4296
    "/  ifTrue / whileTrue should come before ifFalse/whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4297
    #(
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4298
        ifTrue:         ifFalse:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4299
        ifTrue:ifFalse: ifFalse:ifTrue:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4300
        whileTrue:      whileFalse:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4301
        whileTrue       whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4302
        whileTrue:      whileTrue
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4303
        whileFalse:     whileFalse
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4304
        new:            basicNew:
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4305
        new             basicNew
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4306
    ) pairWiseDo:[:sel1 :sel2 |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4307
        |idx1 idx2|
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4308
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4309
        (idx1 := selectorList indexOf:sel1) ~~ 0 ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4310
            (idx2 := selectorList indexOf:sel2) ~~ 0 ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4311
                idx1 > idx2 ifTrue:[ 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4312
                    selectorList swap:idx1 with:idx2
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4313
                ] 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4314
            ] 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4315
        ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4316
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4317
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4318
    "Created: / 01-05-2016 / 17:48:02 / cg"
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4319
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4320
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4321
splitSelectorList:list by:condition
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4322
    |part1 part2 newList|
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4323
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4324
    part1 := list select:condition.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4325
    part2 := list reject:condition.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4326
    part1 isEmpty ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4327
        newList := part2.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4328
    ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4329
        part2 isEmpty ifTrue:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4330
            newList := part1.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4331
        ] ifFalse:[
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4332
            newList := part1 , part2.
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4333
        ]
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4334
    ].
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4335
    ^ newList
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4336
!
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4337
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4338
treeForCode:source allowErrors:allowErrors
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4339
    |tree|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4340
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4341
    source = LastSource ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4342
	tree := LastParseTree.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4343
    ] ifFalse:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4344
	tree := RBParser
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4345
		parseMethod:source
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4346
		onError: [:str :err :nodesSoFar :parserOrNil|
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4347
			allowErrors ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4348
			    "/ parserOrNil isNil if raised by the scanner
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4349
			    parserOrNil notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4350
				^ parserOrNil currentMethodNode
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4351
			    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4352
			].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4353
			^ nil
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4354
		    ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4355
		proceedAfterError:false
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4356
		rememberNodes:true.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4357
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4358
	tree notNil ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4359
	    LastSource := source.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4360
	    LastParseTree := tree.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4361
	]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4362
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4363
    ^ tree
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4364
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4365
    "Modified: / 13-01-2012 / 11:54:30 / cg"
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4366
!
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4367
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4368
tryCodeCompletionWithSource:source nodeInterval:interval at:characterPositionOfCursor mustBeExpression:mustBeExpression into:actionBlock
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4369
    "this is tried multiple times;
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4370
        first with cursor line only
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4371
        then with the source copied up to the cursor position,
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4372
        then with the full source.
4381
43de05e6af6c class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4379
diff changeset
  4373
     Either one may give better results (for example, when completing
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4374
     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
  4375
     legal, but stupid message send to be parsed...
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4376
     (which happens often after inserting)"
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4377
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4378
    |node nodeParent checkedNode characterBeforeCursor|
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4379
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4380
    "/ this is too naive and stupid; if there is a syntactic error,
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4381
    "/ 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
  4382
    "/ 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
  4383
    "/ without any progress.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4384
    "/ 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
  4385
    "/ as it parses the code. Stop, when the interval is hit.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4386
    "/ that will also work for syntactic incorrect source code.
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  4387
    (mustBeExpression not and:[methodOrNil notNil or:[classOrNil notNil]]) ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4388
        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
  4389
    ].           
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4390
    node isNil ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4391
        node := self findNodeForInterval:interval in:source allowErrors:true mustBeMethod:false mustBeExpression:true.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4392
        node isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4393
            "/ Transcript showCR:'No parseNode found (syntax error before or in comment?)'.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4394
            self information:'No parseNode found (syntax error before or in comment?)'.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4395
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4396
        ].
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4397
    ].
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  4398
    "/ (source startsWith:'sel') ifTrue:[self halt].
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4399
    nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4400
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4401
    (node isVariable
4544
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4402
    and:[ nodeParent notNil
a07061d382ce class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4543
diff changeset
  4403
    and:[ nodeParent isMessage
4368
442517f0d19d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4367
diff changeset
  4404
    and:[ node stop < (characterPositionOfCursor-1) ]]]) ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4405
        node := nodeParent.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4406
        nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4407
    ].
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4408
    characterPositionOfCursor > source size ifTrue:[^ self].
4525
71ebd312132a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4524
diff changeset
  4409
    characterBeforeCursor := source at:(characterPositionOfCursor-1 max:1). "/ codeView characterBeforeCursor.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4410
    characterBeforeCursor isNil ifTrue:[ "at begin of line" ^ self].
4358
d9978bce6853 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4356
diff changeset
  4411
    characterBeforeCursor == $. ifTrue:[ "at end of statement" ^ self].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4412
 
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4413
    node isVariable ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4414
        |nodeIsInTemporaries nodeIsInBlockArguments nodeIsInMethodArguments |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4415
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4416
        nodeIsInTemporaries :=
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4417
            nodeParent notNil
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4418
            and:[ nodeParent isSequence
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4419
            and:[ nodeParent temporaries notEmptyOrNil
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4420
            and:[ node stop <= nodeParent temporaries last stop ]]]. 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4421
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4422
        nodeIsInBlockArguments :=
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4423
            node blockScope notNil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4424
            and:[ node blockScope arguments notEmptyOrNil
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4425
            and:[ node stop <= node blockScope arguments last stop ]].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4426
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4427
        (nodeIsInBlockArguments not and:[rememberedScopeNodes notNil]) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4428
            "/ 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
  4429
            nodeIsInBlockArguments := 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4430
                rememberedScopeNodes 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4431
                    contains:[:scope |
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4432
                        (scope isMethod or:[scope isBlock])
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4433
                        and:[scope arguments notEmpty
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4434
                        and:[scope arguments first start <= node start
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4435
                        and:[scope arguments last stop >= node stop]]].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4436
                    ].        
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4437
        ].
5106
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  4438
        nodeIsInTemporaries ifTrue:[ self codeCompletionForTempVariable:node into:actionBlock. ^ self ]. 
5303d78eb69a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
  4439
        nodeIsInBlockArguments ifTrue:[ self codeCompletionForBlockArgument:node into:actionBlock. ^ self ]. 
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4440
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4441
        "/ for variable completion, cursor must be right after the node 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4442
        codeView characterPositionOfCursor = (node stop + 1) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4443
            codeView characterBeforeCursor ~= Character space ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4444
                self codeCompletionForVariable:node into:actionBlock.
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4445
                ^ self.
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4446
            ]. 
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4447
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4448
        "/ nodeParent isNil or:[nodeParent isMessage not]
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4449
    ].
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4450
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4451
false ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4452
        codeView characterPositionOfCursor = (node stop + 2) ifTrue:[
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4453
            |classes cls| 
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4454
            "/ after a variable;
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4455
            "/ offer local messages, if receiver type is known
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4456
            classes := (self classesOfNode:node).
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4457
            classes notEmptyOrNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4458
                classes size > 1 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4459
                    cls := classes anElement.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4460
                ] ifFalse:[    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4461
                    cls := Behavior commonSuperclassOf:classes.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4462
                ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4463
            ]. 
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4464
            cls notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4465
                |clsSelectors moreSelectors|
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4466
            
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4467
                "/ completion in a message-send
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4468
                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
  4469
                clsSelectors size < 30 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4470
                    cls superclass notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4471
                        moreSelectors := cls superclass methodDictionary keys.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4472
                        clsSelectors size + moreSelectors size < 30 ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4473
                            clsSelectors := clsSelectors , moreSelectors.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4474
                        ].
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4475
                    ].    
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4476
                ].
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4477
                "/ self codeCompletionForMessage:checkedNode into:actionBlock.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4478
                actionBlock value:clsSelectors value:nil value:nil.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4479
                ^ self.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4480
            ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4481
        ]
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4482
].
4367
dd00d1570f88 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4366
diff changeset
  4483
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4484
    node isLiteral ifTrue:[
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4485
        "/ however, user may want to complete a symbol inside a literal array!!
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4486
        node value isArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4487
            node token isLiteralArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4488
                |elementBeforeCursor searcher|
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4489
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4490
                elementBeforeCursor := node token value detect:[:anElementToken | characterPositionOfCursor == (anElementToken stop + 1)] ifNone:nil.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4491
                elementBeforeCursor isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4492
                    searcher :=
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4493
                        [:tok :check |
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4494
                            tok isLiteralArray ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4495
                                tok value inject:nil into:[:found :el | found ifNil:[searcher value:el value:check]]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4496
                            ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4497
                                (check value:tok) ifTrue:[tok] ifFalse:[nil]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4498
                            ]
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4499
                        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4500
                    elementBeforeCursor := searcher value:node token value:[:anElementToken | characterPositionOfCursor == (anElementToken stop)].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4501
                ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4502
                (elementBeforeCursor notNil and:[ elementBeforeCursor value isSymbol ]) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4503
                    self codeCompletionForLiteralSymbol:nil element:elementBeforeCursor considerAll:true into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4504
                    ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4505
                ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4506
            ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4507
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4508
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4509
        "/ cursor must be right after the literal
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4510
        characterPositionOfCursor == (node stop + 1) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4511
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4512
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4513
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4514
        node value isSymbol ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4515
            self codeCompletionForLiteralSymbol:node element:nil considerAll:false into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4516
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4517
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4518
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4519
        "/ huh - completing strings, numbers or what?
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4520
        (nodeParent notNil
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4521
            and:[ nodeParent isMessage
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4522
            and:[ nodeParent isKeyword ]])
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4523
        ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4524
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4525
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4526
        "/ no, move up and try completing the outer keyword message (next arg)
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4527
        node := nodeParent.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4528
        nodeParent := node parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4529
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4530
5050
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4531
    Verbose == true ifTrue:[
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4532
        Transcript show:'node is '.
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4533
        Error ignoreIn:[ Transcript show:node ].
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4534
        Transcript cr.
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4535
    ].
ffb39e4501e5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  4536
    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4537
    "/ if in a keyword-argument position...
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4538
    node isMessage ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4539
        "/ where are we?
5379
0f89327edf3c #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5370
diff changeset
  4540
        node selectorString last == $: "node selector isSymbol" ifTrue:[
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4541
            characterBeforeCursor == $: ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4542
                |argIdx senders implementors receiverClasses selectorUpToCursor implementorOfSelectorUpToCursor|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4543
                "/ about to enter an argument?
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4544
                argIdx := node selectorParts keysAndValuesDetectKey:[:idx :part |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4545
                            part stop == (codeView characterPositionOfCursor-1). 
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4546
                          ] ifNone:nil.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4547
                argIdx notNil ifTrue:[          
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4548
                    selectorUpToCursor := ((node selectorParts collect:#value) copyTo:argIdx) asStringWith:''.        
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4549
                    implementors := Set new.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4550
                    "/ 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
  4551
                    "/ this takes too long for a completion;
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4552
                    "/    Smalltalk allClassesDo:[:cls |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4553
                    "/        cls instAndClassMethodsDo:[:m |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4554
                    "/            (m sendsMessageForWhich:[:sel | sel startsWith:node selector]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4555
                    "/                senders add:m
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4556
                    "/            ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4557
                    "/        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4558
                    "/    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4559
                    "/ therefore, restrict to a max. of 5 classes
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4560
                    receiverClasses := self classesOfNode:node receiver.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4561
                    (receiverClasses notEmptyOrNil and:[receiverClasses size <= 5]) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4562
                        receiverClasses do:[:eachPossibleReceiverClass |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4563
                            eachPossibleReceiverClass withAllSuperclassesDo:[:cls |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4564
                                cls methodDictionary keysAndValuesDo:[:sel :mthd |
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4565
                                    (sel startsWith:selectorUpToCursor) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4566
                                        implementors add:mthd.
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4567
                                        (sel = selectorUpToCursor) ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4568
                                            implementorOfSelectorUpToCursor := implementorOfSelectorUpToCursor ? mthd
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4569
                                        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4570
                                    ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4571
                                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4572
                            ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4573
                        ]
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4574
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4575
                    implementorOfSelectorUpToCursor notNil ifTrue:[
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4576
                        |tree argName|
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4577
                        
5123
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4578
                        SourceCodeManagerError handle:[:ex |
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4579
                        ] do:[    
5392
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4580
                            tree := implementorOfSelectorUpToCursor parseTree. 
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4581
                            tree notNil ifTrue:[
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4582
                                argName := tree argumentNames at:argIdx.
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4583
                                (argName includesString:'block' caseSensitive:false) ifTrue:[
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4584
                                    actionBlock value:{'[ "',argName,'" ]'}
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4585
                                                value:{ self editActionToInsert:('[ "',argName,'" ]') }
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4586
                                                value:'block argument'
2dc73ed82d4b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5385
diff changeset
  4587
                                ]. 
5123
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4588
                            ].
92455fb1f46f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5119
diff changeset
  4589
                        ].    
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4590
                    ] ifFalse:[    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4591
                        implementors notEmpty ifTrue:[
5082
87e1ffeceb8a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5081
diff changeset
  4592
                            self breakPoint:#cg.
5080
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4593
                        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4594
                    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4595
                ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4596
            ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4597
        ].    
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4598
    ].
0842b08b7040 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5076
diff changeset
  4599
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4600
    (node isVariable or:[node isBlock and:[node stop notNil]]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4601
        (characterPositionOfCursor == (node stop + 1)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4602
        "/ hack (spaces at end of line)
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4603
        or:[characterPositionOfCursor == (node stop)]) ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4604
            codeView characterBeforeCursor == Character space ifTrue:[
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4605
                self codeCompletionForMessageTo:node into:actionBlock.
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4606
                ^ self
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4607
            ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4608
        ].
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4609
    ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4610
5114
856f583b1fff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5113
diff changeset
  4611
    "/ characterBeforeCursor == $) ifTrue:[self halt].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  4612
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4613
    "/ move outward, until we find a message-send node,
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4614
    "/ or the method's selector pattern node.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4615
    checkedNode := node.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4616
    [checkedNode notNil] whileTrue:[
5322
407a341d0c83 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5312
diff changeset
  4617
        (characterPositionOfCursor <= ((checkedNode stop ? source size)+1)) ifTrue:[
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4618
            "/ Transcript show:'T: '; showCR:node.
5048
8dbd0140a2f0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5047
diff changeset
  4619
            "/ Transcript showCR:('Inside a ',(checkedNode className)).
5043
721c2ef8d1bb #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5042
diff changeset
  4620
            "/ self information:('Inside a ',(checkedNode className)).
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4621
            (checkedNode isMessage 
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4622
            and:[characterPositionOfCursor < (checkedNode selectorParts first start)]) ifTrue:[
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4623
                self codeCompletionForMessageTo:checkedNode receiver into:actionBlock.
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4624
                ^ self
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4625
            ]
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4626
            
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4627
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4628
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4629
        checkedNode isMessage ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4630
            "/ completion in a message-send
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4631
            "/ Transcript showCR:'codeCompletionForMessage'.
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4632
            self codeCompletionForMessage:checkedNode into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4633
            ^ self
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4634
        ].
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4635
        checkedNode isMethod ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4636
            "/ completion in a method's selector pattern
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4637
            "/ Transcript showCR:'codeCompletionForMethodSpec'.
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4638
            self codeCompletionForMethodSpec:checkedNode into:actionBlock.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4639
            ^ self.
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4640
        ].
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4641
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4642
4931
Claus Gittinger <cg@exept.de>
parents: 4926
diff changeset
  4643
        checkedNode := checkedNode parent.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4644
    ].
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4645
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4646
    "/ Transcript showCR:'Node is neither variable nor message'.
4352
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4647
    self information:'Node is neither variable nor message.'.
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4648
8e3e22043a75 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4350
diff changeset
  4649
    "Modified: / 04-07-2006 / 18:48:26 / fm"
5041
db886e8fb099 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5040
diff changeset
  4650
    "Modified: / 01-05-2016 / 19:00:33 / cg"
5040
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4651
!
f02e9db9841e #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5039
diff changeset
  4652
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4653
withoutSelectorsUnlikelyFor:aClass from:selectorsArg forPartial:partialSelector
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4654
    "some heuristics;
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4655
     as best selectors has been chosen by implemented methods for aClass,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4656
     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
  4657
     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
  4658
     implement at:put: themself.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4659
     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
  4660
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4661
    |selectors noNilChecks noIsXXXChecks noNoXXXChecks noBecome 
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4662
     noIndexedSetters noIndexedGetters noSizeQueries docSelectors|
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4663
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4664
    aClass isNil ifTrue:[ ^ selectorsArg ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4665
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4666
    noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := false.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4667
    noIndexedSetters := noIndexedGetters := noSizeQueries := false.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4668
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4669
    selectors := (selectorsArg ? #()) asOrderedCollection.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4670
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4671
    self tracePoint:#cg message:aClass.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4672
5112
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4673
    aClass isMeta ifTrue:[
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4674
        docSelectors := #(copyright documentation examples 
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4675
                          version version_CVS version_SVN version_HG).
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4676
        selectors := selectors reject:[:sel | docSelectors includes:sel].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4677
    ].
a25d288252f4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5109
diff changeset
  4678
    
5070
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4679
    "/ actually meaning booleans here
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4680
    (aClass == True or:[aClass == False]) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4681
        noNilChecks := noBecome := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4682
        (partialSelector startsWith:'is') ifFalse:[ noIsXXXChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4683
        (partialSelector startsWith:'no') ifFalse:[ noNoXXXChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4684
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4685
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4686
    (aClass includesBehavior: ArithmeticValue) ifTrue:[ noNilChecks := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4687
    (aClass includesBehavior: Symbol) ifTrue:[ noNilChecks := noBecome := noIndexedSetters := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4688
    (aClass includesBehavior: Number) ifTrue:[ noBecome := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4689
    (aClass includesBehavior: Block) ifTrue:[ noNilChecks := noIsXXXChecks := noNoXXXChecks := noBecome := true ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4690
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4691
    (aClass isMeta) ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4692
        noNilChecks := noBecome := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4693
        "/ 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
  4694
        selectors := selectors reject:
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4695
            [:sel |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4696
                (Object implements:sel)
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4697
                and:[ (Smalltalk allImplementorsOf:sel) conform:[:impl | impl isMeta not]]
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4698
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4699
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4700
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4701
    aClass isVariable ifFalse:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4702
        noIndexedGetters := noIndexedSetters := noSizeQueries := true.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4703
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4704
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4705
    noIndexedSetters ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4706
        #( #'at:put:' #'basicAt:put:') do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4707
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4708
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4709
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4710
        ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4711
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4712
    noIndexedGetters ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4713
        #( #'at:' #'basicAt:') do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4714
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4715
                selectors := selectors copyWithout:indexAccessSelector.
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
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4719
    noSizeQueries ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4720
        #( #size #basicSize ) do:[:indexAccessSelector |
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4721
            (aClass whichClassIncludesSelector:indexAccessSelector) == Object ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4722
                selectors := selectors copyWithout:indexAccessSelector.
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4723
            ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4724
        ].
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
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4727
    noNilChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4728
        selectors removeAllFoundIn:#(
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4729
                    'isNil' 'notNil'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4730
                    'ifNil:' 'ifNotNil:' 'ifNil:ifNotNil:' 'ifNotNil:ifNil:' 'ifNotNilDo:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4731
                    'ifEmpty:' 'ifNotEmpty:' 'ifNotEmptyDo:' 'ifEmpty:ifNotEmpty:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4732
                    'ifEmpty:ifNotEmptyDo:' 'ifNotEmptyDo:ifEmpty:' 'ifEmptyDo:ifNotEmpty:'
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4733
                  ).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4734
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4735
    noIsXXXChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4736
        "/ get rid of all isXXX selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4737
        selectors := selectors reject:[:sel | sel startsWith:'is'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4738
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4739
    noNoXXXChecks ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4740
        "/ get rid of all notXXX selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4741
        selectors := selectors reject:[:sel | sel startsWith:'no'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4742
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4743
    noBecome ifTrue:[
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4744
        "/ get rid of all become* selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4745
        selectors := selectors reject:[:sel | sel startsWith:'become'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4746
        selectors remove:#oneWayBecome: ifAbsent:[].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4747
        selectors := selectors reject:[:sel | sel startsWith:'changeClassTo'].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4748
    ].
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4749
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4750
    "/ 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
  4751
    selectors := (selectors select:[:sel | aClass implements:sel])
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4752
                 ,
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4753
                 (selectors reject:[:sel | aClass implements:sel]).
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4754
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4755
    ^ selectors
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4756
! !
8277d17c3e50 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5064
diff changeset
  4757
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4758
!DoWhatIMeanSupport methodsFor:'code completion-helpers-old'!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4759
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4760
codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4761
    |sym possibleCompletions best start stop oldLen newLen oldVar|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4762
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4763
    sym := node value.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4764
    possibleCompletions := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4765
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4766
    Symbol allInstancesDo:[:existingSym |
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4767
	(existingSym startsWith:sym) ifTrue:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4768
	    (existingSym = sym) ifFalse:[
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4769
		possibleCompletions add:existingSym
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4770
	    ].
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4771
	].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4772
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4773
    possibleCompletions sort.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4774
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4775
    best := possibleCompletions longestCommonPrefix.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4776
    (best = sym or:[(possibleCompletions includes:best) not]) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4777
	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
  4778
	best isNil ifTrue:[^ self].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4779
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4780
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4781
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4782
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4783
    start := node start.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4784
    stop := node stop.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4785
    (codeView characterAtCharacterPosition:start) == $# ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4786
	start := start + 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4787
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4788
    (codeView characterAtCharacterPosition:start) == $' ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4789
	start := start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4790
	stop := stop - 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4791
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4792
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4793
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4794
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4795
    codeView
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4796
	undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4797
	info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4798
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4799
    (best startsWith:oldVar) ifTrue:[
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4800
	oldLen := stop - start + 1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4801
	newLen := best size.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4802
	codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4803
	codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4804
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4805
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4806
    "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
  4807
    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4808
!
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  4809
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4810
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
  4811
    "going to be OBSOLETE"
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4812
    
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4813
    |selector
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  4814
     bestSelectors selector2 bestSelectors2 bestSelectorsFromRB allBest best numArgs
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4815
     newParts nSelParts oldLen newLen selectorParts
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4816
     findBest parentNode selectorInBest selector2InBest2
5044
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4817
     parser selectorsSentInCode selectorsImplementedInClass
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4818
     varName rbTypes rbType tryParent parentIsKeywordMessage parentIsBinaryMessage rcvrClass|
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4819
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4820
    RefactoryTyper notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4821
        "/ refactory package also provides a (very limited) typer;
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4822
        "/ 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
  4823
        (node receiver isVariable) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4824
            varName := node receiver name.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4825
            varName isUppercaseFirst ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4826
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4827
                tree := RBParser
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4828
                            parseMethod:codeView contents string
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4829
                            onError:[:aString :pos | nil].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4830
                tree notNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4831
                    rbTypes := RefactoryTyper
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4832
                                classesFor: varName
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4833
                                in: tree
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4834
                                model: nil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4835
                                ignoredSelectors:(Array with:node selector).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4836
                    rbTypes size > 0 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4837
                        rbTypes size > 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4838
                            rbTypes remove:ProtoObject ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4839
                            rbTypes remove:Autoload ifAbsent:[].
4845
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  4840
                            (Smalltalk includesKey:#ObsoleteObject) ifTrue:[
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  4841
                                rbTypes remove:(Smalltalk at:#ObsoleteObject) ifAbsent:[].
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  4842
                            ]
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4843
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4844
                        rbTypes size == 1 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4845
                            rbType := rbTypes first.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4846
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4847
                            rbType := Class commonSuperclassOf:rbTypes
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4848
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4849
                        (rbType notNil "and:[rbType ~= Object]") ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4850
                            bestSelectorsFromRB := Parser findBest:30 selectorsFor:node selector in:rbType forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4851
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4852
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4853
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4854
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4855
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4856
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4857
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4858
    classOrNil notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4859
        parser := Parser parseMethod:codeView contents string in:classOrNil ignoreErrors:true ignoreWarnings:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4860
        selectorsSentInCode := parser messagesSent.
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  4861
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4862
    classOrNil notNil ifTrue:[
4936
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4863
        selectorsImplementedInClass := Set new.
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4864
        classOrNil withAllSuperclassesDo:[:cls |
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4865
            cls theNonMetaclass ~~ Object ifTrue:[
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4866
                selectorsImplementedInClass addAll:cls selectors.
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4867
            ]
486789a85cea #FEATURE
Claus Gittinger <cg@exept.de>
parents: 4934
diff changeset
  4868
        ]    
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4869
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4870
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4871
    findBest := [:node :selector |
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4872
        |srchClasses bestSelectors bestPrefixes|
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4873
4933
9801e2eea4c7 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 4931
diff changeset
  4874
        codeView withCursor:(Cursor questionMark) do:[
5035
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4875
            srchClasses := self classesOfNode:node receiver.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4876
            srchClasses notNil ifTrue:[
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4877
                bestSelectors := Set new.
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4878
                srchClasses do:[:each |
5afe663f6f8d #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5033
diff changeset
  4879
                    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
  4880
                ]    
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4881
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4882
                bestSelectors := Parser findBest:30 selectorsFor:selector in:nil forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4883
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4884
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4885
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4886
        (bestSelectors includes:selector) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4887
            bestSelectors := bestSelectors select:[:sel | sel size > selector size].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4888
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4889
        bestSelectors
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4890
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4891
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4892
    selector := node selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4893
    bestSelectors := findBest value:node value:selector.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4894
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4895
    parentNode := node parent.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4896
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4897
    parentIsKeywordMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4898
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4899
            and:[ parentNode isMessage
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  4900
            and:[ parentNode selector isKeyword]]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4901
    parentIsBinaryMessage :=
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4902
        (parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4903
            and:[ parentNode isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4904
            and:[ parentNode selector isBinarySelector]]).
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4905
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4906
    tryParent := false.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4907
    "/ 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
  4908
    (node selector isUnarySelector and:[ parentIsKeywordMessage ]) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4909
        tryParent := true.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4910
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4911
        "/ 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
  4912
        (node isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4913
        and:[ node receiver isMessage
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4914
        and:[ node receiver receiver isVariable
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4915
        and:[ node receiver receiver name isUppercaseFirst
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4916
        and:[ #(new new:) includes:(selector2 := node receiver selector) ]]]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4917
            rcvrClass := Smalltalk classNamed:(node receiver receiver name).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4918
            "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4919
            bestSelectors := Parser findBest:30 selectorsFor:selector in:rcvrClass forCompletion:true.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4920
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4921
            "/ also, if nothing was found
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4922
            (bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4923
            and:[ parentNode notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4924
            and:[ parentNode isMessage ]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4925
                "/ srchClass2 := self lookupClassForMessage:parentNode inClass:classOrNil.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4926
                "/ selector2 := parentNode selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4927
                "/ selector2 := selector2,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4928
                bestSelectors := findBest value:parentNode value:selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4929
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4930
        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4931
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4932
    tryParent ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4933
        selector2 := parentNode selector,selector.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4934
        bestSelectors2 := findBest value:parentNode value:selector2.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4935
    ].
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4936
    bestSelectorsFromRB notEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4937
        bestSelectors := bestSelectorsFromRB , (bestSelectors reject:[:sel | bestSelectorsFromRB includes:sel]).
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4938
    ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4939
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4940
    "/ if the parent is a keyword selector, the child cannot
4346
e70115a3a9e6 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4345
diff changeset
  4941
    (parentIsKeywordMessage or:[parentIsBinaryMessage]) ifTrue:[
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  4942
        bestSelectors := bestSelectors reject:[:sel | sel isKeyword]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4943
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4944
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4945
    bestSelectors2 isEmptyOrNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4946
        allBest := bestSelectors.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4947
    ] ifFalse:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4948
        bestSelectors isEmptyOrNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4949
            allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4950
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4951
            selectorInBest := (bestSelectors contains:[:sel | sel asLowercase startsWith:selector asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4952
            selector2InBest2 := (bestSelectors2 contains:[:sel | sel asLowercase startsWith:selector2 asLowercase]).
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4953
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4954
            (selectorInBest not and:[ selector2InBest2 ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4955
                "/ selector2 is more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4956
                allBest := bestSelectors2
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4957
            ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4958
                (selectorInBest and:[ selector2InBest2 not ]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4959
                    "/ selector more likely
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4960
                    allBest := bestSelectors
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4961
                ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4962
                    "/ assume same likelyness
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4963
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4964
                    allBest := bestSelectors isEmpty
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4965
                                ifTrue:[ bestSelectors2 ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4966
                                ifFalse:[ bestSelectors , #(nil) , bestSelectors2 ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4967
                ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4968
            ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4969
        ].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4970
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4971
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4972
    allBest isEmptyOrNil ifTrue:[ ^ self ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4973
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4974
    selectorsImplementedInClass notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4975
        "/ 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
  4976
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4977
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4978
                    by:[:sel | selectorsImplementedInClass includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4979
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4980
    selectorsSentInCode notNil ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4981
        "/ 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
  4982
        allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4983
                    splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4984
                    by:[:sel | selectorsSentInCode includes:sel].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4985
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4986
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4987
    "/ 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
  4988
    allBest := self 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4989
                splitSelectorList:allBest 
f8c330427edc #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5043
diff changeset
  4990
                by:[:sel | sel notNil and:[sel startsWith:selector]].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4991
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4992
    best := allBest first.
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  4993
    allBest size > 1 ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4994
        "allBest size < 20 ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4995
            |idx|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4996
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4997
            idx := (PopUpMenu labels:allBest) startUp.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4998
            idx == 0 ifTrue:[ ^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  4999
            best := allBest at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5000
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5001
            allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5002
            best := Dialog request:'Matching selectors:' initialAnswer:best list:allBest.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5003
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5004
        ]."
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5005
        allBest remove:nil ifAbsent:[].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5006
        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
  5007
        best isEmptyOrNil ifTrue:[^ self].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5008
        best = '-' ifTrue:[^ self].
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5009
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5010
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5011
"/    srchClass notNil ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5012
"/        implClass := srchClass whichClassIncludesSelector:best.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5013
"/    ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5014
"/        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
  5015
"/        implClass size == 1 ifTrue:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5016
"/            implClass := implClass first.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5017
"/        ] ifFalse:[
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5018
"/            implClass := nil
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5019
"/        ]
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5020
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5021
"/
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5022
"/    info := best storeString.
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5023
"/    implClass notNil ifTrue:[
5397
HG Automerge
parents: 5388 5392
diff changeset
  5024
"/        info := implClass name , '  ' , info.
4547
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5025
"/    ].
4cec3ca730ed class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4545
diff changeset
  5026
"/    self information:info.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5027
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5028
    best ~= selector ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5029
        numArgs := best numArgs.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5030
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5031
        (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:best]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5032
            selectorParts := parentNode selectorParts , node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5033
        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5034
            selectorParts := node selectorParts.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5035
        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5036
        nSelParts := selectorParts size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5037
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5038
        newParts := best asCollectionOfSubstringsSeparatedBy:$:.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5039
        newParts := newParts select:[:part | part size > 0].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5040
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5041
        codeView
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5042
            undoableDo:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5043
                |newCursorPosition stop|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5044
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5045
                numArgs > nSelParts ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5046
                    stop := selectorParts last stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5047
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5048
                    "/ append the rest ...
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5049
                    numArgs downTo:nSelParts+1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5050
                        |newPart|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5051
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5052
                        newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5053
                        (best endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5054
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5055
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5056
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5057
                        (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5058
                            newPart := ':' , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5059
                        ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5060
                        newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5061
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5062
                        codeView replaceFromCharacterPosition:stop to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5063
                        newCursorPosition := stop + newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5064
                    ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5065
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5066
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5067
                (nSelParts min:newParts size) downTo:1 do:[:idx |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5068
                    |newPart oldPartialToken start stop nextChar|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5069
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5070
                    newPart := newParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5071
                    oldPartialToken := selectorParts at:idx.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5072
                    start := oldPartialToken start.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5073
                    stop := oldPartialToken stop.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5074
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5075
                    (best isKeyword) ifTrue:[
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5076
                        (oldPartialToken value endsWith:$:) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5077
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5078
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5079
                            (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5080
                                newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5081
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5082
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5083
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5084
                        (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5085
                            newPart := newPart , ':'
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5086
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5087
                            nextChar := codeView characterAtCharacterPosition:stop+1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5088
                            nextChar isSeparator ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5089
                                (').' includes:nextChar) ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5090
                                    newPart := newPart , ' '
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5091
                                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5092
                            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5093
                        ]
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5094
"/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5095
"/                        ] ifFalse:[
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5096
"/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
4710
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5097
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5098
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5099
                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5100
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5101
                    "/ codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5102
                    newCursorPosition isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5103
                        oldLen := stop - start + 1.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5104
                        newLen := newPart size.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5105
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5106
                        newCursorPosition := stop + (newLen-oldLen)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5107
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5108
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5109
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5110
                codeView cursorToCharacterPosition:newCursorPosition.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5111
                codeView cursorRight.  "/ avoid going to the next line !!
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5112
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5113
                ((best endsWith:':') and:[numArgs == 1]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5114
                    |impls impl|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5115
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5116
                    "/ see if it expects a block argument (heuristic)
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5117
                    best := best asSymbol.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5118
                    (node notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5119
                    and:[classOrNil notNil
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5120
                    and:[node receiver isSelf]]) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5121
                        (impl := classOrNil whichClassImplements:best) isNil ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5122
                            impls := #().
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5123
                            Screen current beep.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5124
                        ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5125
                            impls := { impl }
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5126
                        ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5127
                    ] ifFalse:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5128
                        impls := Smalltalk allImplementorsOf:best.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5129
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5130
                    (impls contains:[:cls |
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5131
                        |argName|
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5132
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5133
                        argName := ((cls compiledMethodAt:best) methodArgAndVarNames at:1) asLowercase.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5134
                        (argName includesString:'block') or:[ (argName includesString:'action')]]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5135
                    ) ifTrue:[
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5136
                        codeView insertStringAtCursor:'['
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5137
                    ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5138
                ].
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5139
                codeView dontReplaceSelectionOnInput.
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5140
            ]
94634917ce8f class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4691
diff changeset
  5141
        info:'Completion'.
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5142
    ].
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5143
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5144
    "Created: / 10-11-2006 / 13:18:27 / cg"
5038
137974a28198 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5035
diff changeset
  5145
    "Modified: / 30-04-2016 / 18:21:21 / cg"
4845
6a5c44a7d42e Removed dependency on stx:libboss, stx:libjava and stx:libjavascript
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4830
diff changeset
  5146
    "Modified: / 25-09-2015 / 07:39:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4345
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5147
!
a510223345e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4344
diff changeset
  5148
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5149
codeCompletionForVariable:node inClass:classOrNil codeView:codeView
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5150
    |parent nonMetaClass crsrPos nm
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5151
     allVariables allDistances best nodeVal
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5152
     char start stop oldLen newLen oldVar
4485
c6ed849af389 class: DoWhatIMeanSupport
Stefan Vogel <sv@exept.de>
parents: 4484
diff changeset
  5153
     getDistanceComputeBlockWithWeight addWithFactorBlock allTheBest bestAssoc
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5154
     globalFactor localFactor selectorOfMessageToNode tree implementors argIdx namesUsed kwPart|
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5155
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5156
    classOrNil notNil ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5157
        nonMetaClass := classOrNil theNonMetaclass.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5158
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5159
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5160
    nm := node name.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5161
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5162
    "/ 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
  5163
    "/ the user is probably looking for a message selector.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5164
    "/ If the variable represents a global, present its instance creation messages
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5165
    crsrPos := codeView characterPositionOfCursor.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5166
    char := codeView characterAtCharacterPosition:crsrPos-1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5167
    char isSeparator ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5168
        classOrNil isNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5169
            nodeVal := Smalltalk at:nm asSymbol.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5170
        ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5171
            nodeVal := classOrNil topNameSpace at:nm asSymbol ifAbsent:[Smalltalk at:nm asSymbol].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5172
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5173
        nodeVal isBehavior ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5174
            |methods menu exitKey idx|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5175
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5176
            methods := nodeVal class methodDictionary values
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5177
                            select:[:m | |cat|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5178
                                cat := m category asLowercase.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5179
                                cat = 'instance creation'
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5180
                            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5181
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5182
            menu := PopUpMenu labels:(methods collect:[:each | each selector]).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5183
            menu hideOnKeyFilter:[:key | |hide|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5184
                    hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5185
                    hide ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5186
                        exitKey := key.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5187
                    ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5188
                    hide].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5189
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5190
            idx := menu startUp.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5191
            idx == 0 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5192
                exitKey notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5193
                    codeView keyPress:exitKey x:0 y:0.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5194
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5195
                ^ self
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5196
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5197
            best := (methods at:idx) selector.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5198
            codeView
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5199
                undoableDo:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5200
                    codeView insertString:best atCharacterPosition:crsrPos.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5201
                    codeView cursorToCharacterPosition:crsrPos+best size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5202
                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5203
                info:'completion'.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5204
            ^ self.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5205
        ].
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
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5208
    ((parent := node parent) notNil and:[parent isMessage]) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5209
        node == parent receiver ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5210
            selectorOfMessageToNode := parent selector
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5211
        ]
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
    getDistanceComputeBlockWithWeight :=
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5215
        [:weight |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5216
            [:each |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5217
                |dist factor|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5218
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5219
                dist := each spellAgainst:nm.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5220
                factor := 1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5221
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5222
                (each startsWith:nm) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5223
                    factor := 6 * nm size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5224
                ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5225
                    (each asLowercase startsWith:nm asLowercase) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5226
                        factor := 4 * nm size.
5360
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5227
                    ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5228
                        (each endsWith:nm) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5229
                            factor := 3 * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5230
                        ] ifFalse:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5231
                            (each asLowercase endsWith:nm asLowercase) ifTrue:[
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5232
                                factor := 2 * nm size.
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5233
                            ]    
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5234
                        ]    
b258afc07129 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
  5235
                    ]    
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5236
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5237
                dist := dist + (weight*factor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5238
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5239
                each -> (dist * weight)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5240
             ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5241
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5242
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5243
    addWithFactorBlock :=
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5244
        [:eachNames :factor | |namesToAdd|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5245
            namesToAdd := eachNames select:[:nameToAdd | nameToAdd ~= nm ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5246
            namesToAdd := namesToAdd reject:[:each | allVariables includes:each ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5247
            allVariables addAll:namesToAdd.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5248
            allDistances addAll:(namesToAdd collect:(getDistanceComputeBlockWithWeight value:factor)).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5249
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5250
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5251
    nm isUppercaseFirst ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5252
        globalFactor := 2.    "/ favour globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5253
        localFactor := 1.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5254
    ] ifFalse:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5255
        globalFactor := 1.    "/ favour locals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5256
        localFactor := 2.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5257
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5258
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5259
    allVariables := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5260
    allDistances := OrderedCollection new.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5261
4308
f1c31624744d class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4304
diff changeset
  5262
    "/ are we in the method's selector spec ?
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5263
    ((parent := node parent) notNil
4277
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5264
    and:[parent isMethod
d55287081b53 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4276
diff changeset
  5265
    and:[parent arguments includes:node]]) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5266
        "/ now that's cool: look how the naem of this argument is in other implementations
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5267
        "/ of this method, and take that as a basis of the selection
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5268
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5269
        implementors := SystemBrowser
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5270
                            findImplementorsOf:(parent selector)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5271
                            in:(Smalltalk allClasses)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5272
                            ignoreCase:false.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5273
        "/ which argument is it
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5274
        argIdx := parent arguments indexOf:node.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5275
        implementors size > 50 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5276
            implementors := implementors asOrderedCollection copyTo:50.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5277
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5278
        namesUsed := implementors
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5279
                        collect:[:eachImplementor |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5280
                            |parseTree|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5281
                            parseTree := eachImplementor parseTree.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5282
                            (parseTree notNil and:[parseTree arguments size > 0])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5283
                                ifFalse:nil
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5284
                                ifTrue:[ (parseTree arguments at:argIdx) name] ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5285
                        thenSelect:[:a | a notNil] as:Set.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5286
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5287
        addWithFactorBlock value:namesUsed value:(2 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5288
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5289
        classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5290
            "/ also, look for the keyword before the argument,
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5291
            "/ and see if there is such an instVar
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5292
            "/ if so, add it with -Arg
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5293
            parent selector isKeyword ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5294
                kwPart := parent selector keywords at:argIdx.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5295
                (classOrNil allInstVarNames includes:(kwPart copyButLast:1)) ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5296
                    addWithFactorBlock
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5297
                        value:(classOrNil allInstVarNames collect:[:nm| nm,'Arg'])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5298
                        value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5299
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5300
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5301
        ]
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5302
    ] ifFalse:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5303
        classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5304
            "/ locals in the block/method
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5305
            |names|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5306
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5307
            names := node allVariablesOnScope.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5308
            "/ if there were no variables (due to a parse error)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5309
            "/ do another parse and see what we have
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5310
            names isEmpty ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5311
                tree := self treeForCode:(codeView contentsAsString string) allowErrors:true.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5312
                "/ better if we already have a body (include locals then)
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5313
                "/ otherwise, only the arguments are considered
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5314
                tree notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5315
                    names := (tree body ? tree) allVariablesOnScope.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5316
                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5317
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5318
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5319
            addWithFactorBlock value:names value:(4 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5320
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5321
            "/ instance variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5322
            addWithFactorBlock value:classOrNil instVarNames value:(3 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5323
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5324
            "/ inherited instance variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5325
            classOrNil superclass notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5326
                addWithFactorBlock value:classOrNil superclass allInstVarNames value:(2.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5327
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5328
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5329
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5330
        selectorOfMessageToNode notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5331
            |names responders nonResponders|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5332
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5333
            "/ responding to that messsage
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5334
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5335
            classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5336
                "/ private classes
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5337
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5338
                                   value:(1.75 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5339
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5340
                "/ class variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5341
                names := nonMetaClass classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5342
                responders := names select:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5343
                nonResponders := names reject:[:classVar | (nonMetaClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5344
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5345
                addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5346
                addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5347
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5348
                "/ superclass var names
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5349
                nonMetaClass allSuperclassesDo:[:superClass |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5350
                    names := superClass classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5351
                    responders := names select:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5352
                    nonResponders := names reject:[:classVar | (superClass classVarAt:classVar) respondsTo:selectorOfMessageToNode].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5353
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5354
                    addWithFactorBlock value:responders value:(1 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5355
                    addWithFactorBlock value:nonResponders value:(0.5 * 1 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5356
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5357
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5358
                "/ namespace vars
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5359
                classOrNil nameSpace ~~ Smalltalk ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5360
                    names := classOrNil topNameSpace keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5361
                    names := names reject:[:nm | nm includes:$:].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5362
                    names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5363
                    responders := names select:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5364
                    nonResponders := names reject:[:nsVar | |c| c := classOrNil topNameSpace at:nsVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5365
                    addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5366
                    addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5367
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5368
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5369
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5370
            "/ globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5371
            names := Smalltalk keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5372
            "/ names := names reject:[:nm | nm includes:$:].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5373
            names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5374
            responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5375
            nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5376
            addWithFactorBlock value:responders value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5377
            addWithFactorBlock value:nonResponders value:(0.5 * 1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5378
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5379
            "/ pool variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5380
            classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5381
                |pool|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5382
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5383
                pool := Smalltalk at:poolName.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5384
                names := pool classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5385
                names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5386
                responders := names select:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5387
                nonResponders := names reject:[:glblVar | |c| c := Smalltalk at:glblVar. c isBehavior not or:[c isLoaded and:[c respondsTo:selectorOfMessageToNode]]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5388
                addWithFactorBlock value:responders value:(2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5389
                addWithFactorBlock value:nonResponders value:(0.5 * 2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5390
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5391
        ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5392
            |names|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5393
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5394
            classOrNil notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5395
                "/ private classes
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5396
                addWithFactorBlock value:(nonMetaClass privateClasses collect:[:cls | cls nameWithoutPrefix])
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5397
                                   value:(1.75 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5398
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5399
                "/ class variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5400
                addWithFactorBlock value:nonMetaClass classVarNames value:(2.0 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5401
                classOrNil superclass notNil ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5402
                    addWithFactorBlock value:nonMetaClass superclass allClassVarNames value:(2.0 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5403
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5404
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5405
                "/ namespace vars
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5406
                classOrNil nameSpace ~~ Smalltalk ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5407
                    names := classOrNil nameSpace isNameSpace ifTrue:[classOrNil nameSpace keys] ifFalse:[classOrNil nameSpace privateClasses collect:[:c | c nameWithoutPrefix]].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5408
                    names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5409
                    addWithFactorBlock value:names value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5410
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5411
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5412
                "/ pool variables
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5413
                classOrNil theNonMetaclass sharedPoolNames do:[:poolName |
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5414
                    |pool|
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5415
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5416
                    pool := Smalltalk at:poolName.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5417
                    names := pool classVarNames.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5418
                    addWithFactorBlock value:names value:(2.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5419
                ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5420
            ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5421
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5422
            "/ globals
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5423
            names := Smalltalk keys.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5424
            names := names select:[:nm | nm isUppercaseFirst ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5425
            addWithFactorBlock value:names value:(1.5 * globalFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5426
        ].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5427
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5428
        "/ pseudos - assuming that thisContext is seldom used.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5429
        "/ also assuming, that nil is short so its usually typed in.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5430
        addWithFactorBlock value:#('self') value:(2.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5431
        addWithFactorBlock value:#('nil') value:(0.5 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5432
        addWithFactorBlock value:#('super' 'false') value:(2 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5433
        addWithFactorBlock value:#('thisContext') value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5434
        addWithFactorBlock value:#('true') value:(1 * localFactor).
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5435
        addWithFactorBlock value:#('false') value:(1 * localFactor).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5436
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5437
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5438
    allDistances isEmpty ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5439
    bestAssoc := allDistances at:1.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5440
    bestAssoc := allDistances inject:bestAssoc into:[:el :best | el value > best value
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5441
                                                           ifTrue:[el]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5442
                                                           ifFalse:[best]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5443
                                                    ].
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5444
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5445
    allDistances sort:[:a :b |
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5446
                                a value > b value ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5447
                                    true
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5448
                                ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5449
                                    a value = b value ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5450
                                        a key < b key
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5451
                                    ] ifFalse:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5452
                                        false
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5453
                                    ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5454
                                ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5455
                      ].
4340
b7b73a78385a class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4339
diff changeset
  5456
    ((allTheBest := allDistances) count:[:entry | entry value]) > 20 ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5457
        allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.5)].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5458
        allTheBest size > 15 ifTrue:[
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5459
            allTheBest := allDistances select:[:entry | entry value >= (bestAssoc value * 0.8)].
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5460
        ].
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5461
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5462
4524
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5463
    start := node start.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5464
    stop := node stop.
54079876ac80 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4488
diff changeset
  5465
4548
a5f0ea5916a2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4547
diff changeset
  5466
    best := self askUserForCompletion:('Variable for "%1"' bindWith:node name)
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5467
                 for:codeView at: start
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5468
                 from:(allTheBest collect:[:assoc | assoc key]).
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5469
    best isNil ifTrue:[^ self].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5470
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5471
"/ self showInfo:best.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5472
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5473
    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5474
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5475
    codeView
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5476
        undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5477
        info:'Completion'.
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5478
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5479
    (best startsWith:oldVar) ifTrue:[
5253
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5480
        oldLen := stop - start + 1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5481
        newLen := best size.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5482
        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
43b16e24a811 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5225
diff changeset
  5483
        codeView dontReplaceSelectionOnInput
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5484
    ].
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5485
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5486
    "Created: / 10-11-2006 / 13:16:33 / cg"
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5487
    "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
  5488
    "Modified: / 28-08-2013 / 15:37:28 / cg"
4238
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5489
! !
c4399aff7359 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4214
diff changeset
  5490
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5491
!DoWhatIMeanSupport methodsFor:'helpers-naive type inference'!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5492
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5493
addClassesFromAssignmentTo:varName in:aTree to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5494
    "/ assignments...
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5495
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5496
    aTree allAssignmentNodesDo:[:eachAssignmentNode |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5497
        |leftSide|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5498
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5499
        leftSide := eachAssignmentNode variable.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5500
        leftSide name = varName ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5501
            self 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5502
                addClassesOfExpression:eachAssignmentNode value 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5503
                inClass:classOrNil to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5504
        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5505
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5506
    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5507
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5508
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5509
addClassesFromMessagesSentTo:varNode in:aTree to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5510
    "/ from the set of messages sent at other places,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5511
    "/ try to find classes, which respond to all those.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5512
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5513
    |varName allSelectors candidates|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5514
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5515
    varName := varNode name.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5516
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5517
    allSelectors := IdentitySet new.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5518
    aTree allMessageNodesDo:[:eachMessageNode |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5519
        |rcvr|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5520
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5521
        rcvr := eachMessageNode receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5522
        (rcvr isVariable and:[rcvr name = varName]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5523
            allSelectors add:eachMessageNode selector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5524
        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5525
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5526
    
5324
555436a71f8d #OTHER by mawalch
mawalch
parents: 5322
diff changeset
  5527
    "/ the selector being completed must be ignored here
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5528
    (varNode parent notNil and:[varNode parent isMessage]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5529
        allSelectors remove:(varNode parent selector) ifAbsent:[].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5530
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5531
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5532
    "/ now look for classes which implement all of them
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5533
    candidates := SystemBrowser findRespondersOfAll:allSelectors in:nil ignoreCase:false.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5534
    candidates remove:Object ifAbsent:[].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5535
    setOfTypes addAll:candidates.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5536
    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5537
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5538
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5539
addClassesOfBlockVarForWellknownBlocks:variableNode inScope:blockScope to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5540
    |blockParent blockParentSelector exNode isHandler|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5541
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5542
    blockParent := blockScope parent.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5543
    (blockParent notNil and:[blockParent isMessage]) ifFalse:[^ setOfTypes].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5544
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5545
    blockParentSelector := blockParent selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5546
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5547
    "/ if the parent of the block is an enumeration message, and the receiver is known,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5548
    "/ we know the type of argument.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5549
    ( #(do: keysAndValuesDo: select: collect:) includes:blockParent selector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5550
        |collection|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5551
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5552
        collection := self valueOfNode:blockParent receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5553
        collection notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5554
            (collection isKindOf:Collection) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5555
                collection notEmpty ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5556
                    |someElement|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5557
                    someElement := collection anElement.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5558
                    setOfTypes add:someElement class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5559
                    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5560
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5561
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5562
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5563
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5564
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5565
    "/ because we type-in those so often, it is great to get
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5566
    "/ better info on the ex parameter... (and it's a low hanging fruit)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5567
    ( blockParentSelector == #handle:do: ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5568
        exNode := blockParent receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5569
        isHandler := (blockScope == (blockParent arguments at:1)).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5570
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5571
    ( blockParentSelector == #on:do: ) ifTrue:[
5133
ea59e0c6f090 #BUGFIX by Maren
matilk
parents: 5131
diff changeset
  5572
"/        self halt.
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5573
        exNode := blockParent arg1.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5574
        isHandler := (blockScope == (blockParent arguments at:2)).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5575
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5576
    exNode notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5577
        |cls exClass|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5578
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5579
        ((cls := (self valueOfNode:exNode)) notNil and:[cls isBehavior]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5580
            exClass := cls
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5581
        ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5582
            exClass := Exception
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5583
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5584
        setOfTypes add:exClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5585
        ^ self
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5586
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5587
    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5588
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5589
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5590
addClassesOfExpression:expr inClass:classOrNil to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5591
    |cls exprVal varName varScope instVarClass classVarClass poolVarClass sym|
5131
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5592
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5593
    expr isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5594
        exprVal := expr value.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5595
        cls := exprVal class.         
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5596
        (exprVal isArray or:[ exprVal isByteArray or:[ exprVal isString ]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5597
            exprVal isImmutable ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5598
                setOfTypes add:cls mutableClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5599
                ^ setOfTypes.    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5600
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5601
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5602
        setOfTypes add:cls. 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5603
        ^ setOfTypes.    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5604
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5605
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5606
    expr isBlock ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5607
        setOfTypes add:Block. 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5608
        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5609
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5610
5131
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5611
    thisContext isRecursive ifTrue:[^ setOfTypes].
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5612
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5613
    expr isVariable ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5614
        varName := expr name.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5615
        varName = 'self' ifTrue:[
5272
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5616
            instanceOrNil notNil ifTrue:[
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5617
                setOfTypes add:(instanceOrNil class).
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5618
            ] ifFalse:[    
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5619
                setOfTypes add:(classOrNil ? UndefinedObject).
537ecde55d3d #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5253
diff changeset
  5620
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5621
            ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5622
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5623
        varName = 'super' ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5624
            classOrNil isNil 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5625
                ifTrue:[setOfTypes add:Object]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5626
                ifFalse:[setOfTypes add:classOrNil superclass].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5627
            ^ setOfTypes.    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5628
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5629
        varName = 'thisContext' ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5630
            setOfTypes add:Context.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5631
            ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5632
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5633
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5634
        varScope := expr whoDefines: varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5635
        (varScope notNil) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5636
            varScope isSequence ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5637
                varScope := varScope parent.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5638
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5639
            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5640
            (varScope isBlock) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5641
                self addClassesOfBlockVarForWellknownBlocks:expr inScope:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5642
                self addClassesFromAssignmentTo:varName in:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5643
                self addClassesFromMessagesSentTo:expr in:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5644
                ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5645
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5646
            (varScope isMethod) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5647
                self addClassesFromAssignmentTo:varName in:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5648
                self addClassesFromMessagesSentTo:expr in:varScope to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5649
                ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5650
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5651
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5652
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5653
        classOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5654
            "/ inst var
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5655
            instVarClass := classOrNil whichClassDefinesInstVar:varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5656
            instVarClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5657
                setOfTypes addAll:(self classesOfInstVarNamed:varName inClass:instVarClass).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5658
                ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5659
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5660
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5661
            "/ class vars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5662
            classVarClass := classOrNil theNonMetaclass whichClassDefinesClassVar:varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5663
            classVarClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5664
                "/ see what is currently there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5665
                setOfTypes add:(classVarClass classVarAt:varName asSymbol) class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5666
                ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5667
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5668
            varName isUppercaseFirst ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5669
                "/ private class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5670
                varName knownAsSymbol ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5671
                    cls := classOrNil theNonMetaclass privateClassesAt:varName asSymbol.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5672
                    cls notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5673
                        setOfTypes add:(cls theMetaclass).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5674
                        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5675
                    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5676
                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5677
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5678
            "/ pool vars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5679
            poolVarClass := classOrNil theNonMetaclass whichPoolDefinesPoolVar:varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5680
            poolVarClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5681
                "/ see what is currently there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5682
                setOfTypes add:(poolVarClass classVarAt:varName asSymbol) class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5683
                ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5684
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5685
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5686
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5687
        varName isUppercaseFirst ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5688
            sym := varName asSymbolIfInterned.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5689
            sym notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5690
                exprVal := (Smalltalk at:sym).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5691
                exprVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5692
                    setOfTypes add:(exprVal class).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5693
                ]    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5694
            ].        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5695
        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5696
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5697
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5698
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5699
    (exprVal := self valueOfNode:expr) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5700
        "/ knowing the value is always great!!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5701
        setOfTypes add:exprVal class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5702
        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5703
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5704
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5705
    expr isMessage ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5706
        self addClassesOfMessage:expr inClass:classOrNil to:setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5707
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5708
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5709
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5710
    ^ setOfTypes
5131
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5711
832766a9972f #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5125
diff changeset
  5712
    "Modified: / 07-06-2016 / 11:33:19 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5713
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5714
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5715
addClassesOfInstVarNamed:varName inClass:aClass to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5716
    |instIndex type|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5717
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5718
    instIndex := aClass instVarIndexFor:varName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5719
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5720
    "/ ask the class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5721
    (type := aClass typeOfInstVarNamed:varName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5722
        type isCollection ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5723
            setOfTypes addAll:type.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5724
        ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5725
            setOfTypes add:type.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5726
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5727
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5728
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5729
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5730
    "/ look for instances
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5731
    aClass allSubInstancesDo:[:i |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5732
        |varClass|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5733
        varClass := (i instVarAt:instIndex) class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5734
        setOfTypes add:varClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5735
    ].  
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5736
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5737
    "/ look for assignments in code
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5738
    aClass withAllSubclassesDo:[:eachClass |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5739
        eachClass methodDictionary do:[:m |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5740
            |tree code visitor|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5741
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5742
            "/ quick check
5125
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5743
            SourceCodeManagerError handle:[:ex |
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5744
            ] do:[    
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5745
                code := m source.
63cf17a5b720 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5123
diff changeset
  5746
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5747
            (code notNil and:[code includesString:varName]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5748
                tree := Parser parse:code class:eachClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5749
                (tree notNil and:[tree ~~ #Error]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5750
                    visitor := PluggableParseNodeVisitor new. 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5751
                    visitor 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5752
                        actionForNodeClass:AssignmentNode 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5753
                        put:[:node |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5754
                            |val expr exprSelector|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5755
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5756
                            node variable name = varName ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5757
                                expr := node expression.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5758
                                "/ only look for wellknown types on the right side.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5759
                                expr isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5760
                                    val := expr evaluate.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5761
                                    val isArray ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5762
                                        setOfTypes add:Array 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5763
                                    ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5764
                                        setOfTypes add:val class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5765
                                    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5766
                                ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5767
                                    expr isMessage ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5768
                                        exprSelector := expr selector. 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5769
                                        ( #(+ - * /) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5770
                                            setOfTypes add:Number
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5771
                                        ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5772
                                            ( #(// size) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5773
                                                setOfTypes add:Integer
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5774
                                            ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5775
                                                ( #(copy shallowCopy) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5776
                                                ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5777
                                                    ( #(new new: basicNew basicNew:) includes:exprSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5778
                                                        expr receiver isGlobal ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5779
                                                            setOfTypes add:expr receiver evaluate
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5780
                                                        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5781
                                                    ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5782
self breakPoint:#cg.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5783
                                                    ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5784
                                                ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5785
                                            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5786
                                        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5787
                                    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5788
                                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5789
                            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5790
                            true "/ yes - visit subnodes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5791
                        ].        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5792
                    visitor visit:tree.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5793
                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5794
            ]    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5795
        ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5796
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5797
    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5798
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5799
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5800
addClassesOfMessage:expr inClass:classOrNil to:setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5801
    |valClass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5802
     msgSelector msgReceiver msgArg1
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5803
     receiverClasses receiverClass 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5804
     arg1Classes arg1Value mthd|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5805
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5806
    msgSelector := expr selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5807
         
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5808
    "/ heuristic: quickly assume boolean for some:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5809
    (
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5810
        #( 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5811
            isNil notNil isEmpty isEmptyOrNil notEmpty notEmptyOrNil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5812
            > >= < <= = == ~ ~=
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5813
            knownAsSymbol
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5814
            isMeta 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5815
            includes: contains:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5816
            not and: or:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5817
            exists atEnd positive negative odd even
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5818
        ) includes:msgSelector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5819
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5820
        setOfTypes add:True.  "/ use True, because Boolean does not include the full protocol
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5821
        ^ setOfTypes    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5822
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5823
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5824
    msgReceiver := expr receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5825
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5826
    "/ some hardwired knowledge here
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5827
    receiverClasses := self classesOfNode:msgReceiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5828
    receiverClass := receiverClasses size == 1 ifTrue:[receiverClasses anElement] ifFalse:[nil].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5829
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5830
    receiverClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5831
        "/ follow Smalltalk at: to see what is there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5832
        receiverClass == Smalltalk ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5833
            msgSelector == #at: ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5834
                msgArg1 := expr arg1.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5835
                msgArg1 isLiteralSymbol ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5836
                    arg1Value := Smalltalk at:msgArg1 value.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5837
                    arg1Value notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5838
                        setOfTypes add:arg1Value class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5839
                        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5840
                    ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5841
                ]    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5842
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5843
        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5844
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5845
        "/ usually return something of the receiver's type
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5846
        ( #(copy shallowCopy copyWith: , ) includes:msgSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5847
            setOfTypes addAll:receiverClasses.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5848
            ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5849
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5850
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5851
        ( msgSelector == #class ) ifTrue:[  
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5852
            setOfTypes add:(receiverClass class).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5853
            ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5854
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5855
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5856
        receiverClass isBehavior ifTrue:[                        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5857
            ( #(compiledMethodAt:) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5858
                setOfTypes add:Method.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5859
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5860
            ].            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5861
            ( #(superclass) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5862
                receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5863
                    setOfTypes add:Metaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5864
                ] ifFalse:[    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5865
                    setOfTypes add:Class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5866
                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5867
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5868
            ].            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5869
            ( #(theNonMetaclass theMetaclass) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5870
                receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5871
                    setOfTypes add:Metaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5872
                    ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5873
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5874
                setOfTypes add:(receiverClass perform:msgSelector) class.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5875
                ^ setOfTypes            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5876
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5877
            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5878
            mthd := receiverClass lookupMethodFor:msgSelector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5879
            receiverClass isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5880
                ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: msgSelector ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5881
                    setOfTypes add:receiverClass theNonMetaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5882
                    ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5883
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5884
                "/ if that method sends one of new/basicNew/new:/basicNew:, assume it returns an instance of itself
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5885
                mthd notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5886
                    ( mthd sendsAny:#( #'new' #'basicNew' #'new:' #'basicNew:' )) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5887
                        setOfTypes add:receiverClass theNonMetaclass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5888
                        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5889
                    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5890
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5891
            ] ifFalse:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5892
                mthd notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5893
                    (ParseTreeSearcher methodIsSetterMethod:mthd) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5894
                        setOfTypes add:receiverClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5895
                        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5896
                    ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5897
                ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5898
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5899
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5900
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5901
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5902
    ((msgSelector startsWith:'as')
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5903
    and:[ (valClass := Smalltalk classNamed:(msgSelector copyFrom:3)) notNil ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5904
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5905
        setOfTypes add:valClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5906
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5907
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5908
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5909
    ((msgSelector startsWith:'is')
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5910
    and:[ (valClass := Smalltalk classNamed:(msgSelector copyFrom:3)) notNil ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5911
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5912
        setOfTypes add:True. "/ True - not boolean; it does not contain the full protocol (would not find ifTrue:)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5913
        ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5914
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5915
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5916
    #(
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5917
        size                    SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5918
        hash                    SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5919
        identityHash            SmallInteger
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5920
        class                   Class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5921
        theMetaclass            Metaclass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5922
        theNonMetaclass         Class
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5923
        fork                    Process
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5924
        newProcess              Process
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5925
    ) pairWiseDo:[:sel :clsName |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5926
        msgSelector == sel ifTrue:[ 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5927
            setOfTypes add:(Smalltalk at:clsName).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5928
            ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5929
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5930
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5931
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5932
    ( #( bitAnd: bitOr: bitShift: rightShift: >> << highBit lowBit ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5933
        "/ assume integer
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5934
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5935
        setOfTypes add:Integer.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5936
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5937
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5938
    ( #( + - * // \\ ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5939
        "/ assume numeric
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5940
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5941
        setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5942
        ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5943
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5944
    msgSelector == #/ ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5945
        ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Number]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5946
            setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5947
            ^ setOfTypes.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5948
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5949
        msgArg1 := expr arguments at:1 ifAbsent:nil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5950
        msgArg1 isNil ifTrue:[^ setOfTypes].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5951
        arg1Classes := ((self classesOfNode:msgArg1) ? #()).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5952
        (arg1Classes contains:[:cls | cls includesBehavior:Number]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5953
            setOfTypes add:Number.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5954
            ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5955
        ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5956
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5957
    ( #( construct: / ) includes:msgSelector) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5958
        ((receiverClasses ? #()) contains:[:cls | cls includesBehavior:Filename]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5959
            setOfTypes add:Filename.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5960
            ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5961
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5962
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5963
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5964
    ^ setOfTypes
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5965
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5966
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5967
classOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5968
    "returns the class of a receiver, if it is well-known.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5969
     Otherwise nil (either unknown, or multiple possibilities)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5970
     When showing possible completions for a message,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5971
     it is a good idea to know what the kind receiver is."
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5972
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5973
    | classes |
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5974
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5975
    classes := self classesOfNode:aNode.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5976
    classes size == 1 ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5977
        ^ classes anElement
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5978
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5979
    self breakPoint:#cg.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5980
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5981
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5982
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5983
classesFromAssignmentTo:varName in:aTree
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5984
    ^ self addClassesFromAssignmentTo:varName in:aTree to:IdentitySet new
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5985
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5986
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5987
classesOfInstVarNamed:varName inClass:aClass
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5988
    ^ self addClassesOfInstVarNamed:varName inClass:aClass to:(IdentitySet new)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5989
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5990
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5991
classesOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5992
    "returns the set of possible classes of a parsenode.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5993
     or nil if unknown.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5994
     When showing possible completions for a message,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5995
     it is a good idea to know what the kind receiver is."
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5996
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5997
    ^ self addClassesOfExpression:aNode inClass:classOrNil to:(IdentitySet new).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5998
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  5999
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6000
isNonDestructive:aMessageNode whenSentTo:receiverValue
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6001
    "return true, if it is safe to send aSelector to receiverValue
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6002
     (i.e. has no side effects)"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6003
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6004
    |selector method impl arg1Value|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6005
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6006
    selector := aMessageNode selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6007
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6008
    impl := receiverValue class whichClassIncludesSelector:selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6009
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6010
    ( #( 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6011
        basicSize basicAt:
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6012
        class theMetaclass theNonMetaclass ) includes:selector
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6013
    ) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6014
        ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6015
    ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6016
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6017
    selector == #size ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6018
        "/ mhm - be conservative; someone might have redefined #size
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6019
        "/ more hardwired stuff.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6020
        ((impl == Object) or:[(impl == String) or:[impl isSubclassOf:Collection]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6021
            ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6022
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6023
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6024
    selector == #at: ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6025
        "/ mhm - be conservative; someone might have redefined #at: and do something there
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6026
        "/ more hardwired stuff.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6027
        arg1Value := self valueOfNode:(aMessageNode arg1).
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6028
        arg1Value notNil ifTrue:[            
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6029
            receiverValue == Smalltalk ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6030
                ^ arg1Value isSymbol
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6031
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6032
        
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6033
            ((impl == Object) or:[(impl == String) or:[(impl isSubclassOf:Collection)]]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6034
                ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6035
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6036
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6037
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6038
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6039
    selector argumentCount == 0 ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6040
        "/ follow non-destructive accessors
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6041
        method := receiverValue class lookupMethodFor:selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6042
        method notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6043
            (ParseTreeSearcher methodIsJustReturningSomething:method) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6044
                "/ we can savely call that method to get the current value
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6045
                ^ true.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6046
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6047
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6048
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6049
    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6050
    ^ false
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6051
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6052
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6053
valueAndKindOfVariable:aVariableName
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6054
    "when showing possible completions for a variable,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6055
     it is a good idea to know what the reveiver's value is.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6056
     Sigh - returns nil as value both if unknown AND if a real nil is there"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6057
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6058
    |nodeVal con classInstVarClass classVarClass privateClass pool sym nameSpace topNameSpace|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6059
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6060
    aVariableName isUppercaseFirst ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6061
        classOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6062
            classOrNil isMeta ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6063
                "/ class instVars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6064
                (classInstVarClass := classOrNil whichClassDefinesInstVar:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6065
                    nodeVal := classInstVarClass theNonMetaclass instVarNamed:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6066
                    ^ { nodeVal . #classInstVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6067
                ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6068
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6069
            "/ class vars
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6070
            (classVarClass := classOrNil theNonMetaclass whichClassDefinesClassVar:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6071
                nodeVal := classVarClass classVarAt:aVariableName asSymbol.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6072
                ^ { nodeVal . #classVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6073
            ].    
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6074
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6075
            privateClass := classOrNil theNonMetaclass privateClasses detect:[:cls | cls nameWithoutPrefix = aVariableName] ifNone:nil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6076
            privateClass notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6077
                nodeVal := privateClass.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6078
                ^ { nodeVal . #privateClass }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6079
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6080
            pool := classOrNil theNonMetaclass whichPoolDefinesPoolVar:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6081
            pool notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6082
                nodeVal := pool classVarAt:aVariableName.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6083
                ^ { nodeVal . #poolVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6084
            ].
5118
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6085
            (sym := aVariableName asSymbolIfInterned) notNil ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6086
                ((nameSpace := classOrNil nameSpace) notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6087
                    nameSpace isNameSpace ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6088
                        nodeVal := nameSpace at:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6089
                        (nodeVal notNil or:[nameSpace includesKey:sym]) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6090
                            ^ { nodeVal . #nameSpaceVariable }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6091
                        ].
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6092
                    ].
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6093
                    nodeVal := nameSpace privateClassNamed:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6094
                    (nodeVal notNil) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6095
                        ^ { nodeVal . #privateClass }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6096
                    ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6097
                ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6098
                ((topNameSpace := classOrNil topNameSpace) notNil 
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6099
                and:[topNameSpace ~~ nameSpace
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6100
                and:[topNameSpace ~~ Smalltalk]]) ifTrue:[
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6101
                    nodeVal := topNameSpace at:sym.
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6102
                    (nodeVal notNil or:[topNameSpace includesKey:sym]) ifTrue:[     
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6103
                        ^ { nodeVal . #nameSpaceVariable }
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6104
                    ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6105
                ].    
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6106
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6107
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6108
        (sym := aVariableName asSymbolIfInterned) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6109
            nodeVal := Smalltalk at:sym.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6110
            (nodeVal notNil or:[Smalltalk includesKey:sym]) ifTrue:[     
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6111
                ^ { nodeVal . #global }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6112
            ]
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6113
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6114
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6115
        "/ 'evaluate' the variable (like in a browser's codeView)
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6116
        "/ mhmh - will we catch workspace vars then?
5118
69c5afaa4ddd #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5114
diff changeset
  6117
        Error ignoreIn:[
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6118
            nodeVal := Parser new evaluate:aVariableName in:classOrNil receiver:classOrNil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6119
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6120
        nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6121
            ^ { nodeVal . #global }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6122
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6123
        ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6124
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6125
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6126
    aVariableName = 'self' ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6127
        contextOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6128
            ^ { contextOrNil receiver . #pseudoVar } 
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6129
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6130
        (classOrNil notNil and:[classOrNil isMeta]) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6131
            "/ ^ { classOrNil . #pseudoVar }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6132
            ^ { classOrNil theNonMetaclass . #pseudoVar }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6133
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6134
        ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6135
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6136
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6137
    contextOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6138
        "/ in the debugger, we know more
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6139
        con := contextOrNil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6140
        [ con notNil ] whileTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6141
            "/ a local in the context?
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6142
            ((con argAndVarNames ? #()) includes:aVariableName) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6143
                nodeVal := con argsAndVars at:(con argAndVarNames indexOf:aVariableName) ifAbsent:nil.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6144
                nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6145
                    ^ { nodeVal . #argument }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6146
                ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6147
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6148
            con := con home.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6149
        ].
5370
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6150
        "/ an instvar?
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6151
        (contextOrNil receiver class allInstVarNames includes:aVariableName) ifTrue:[
5370
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6152
            contextOrNil receiver isProtoObject ifFalse:[
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6153
                nodeVal := contextOrNil receiver instVarNamed:aVariableName.
ec87b8971f7b #BUGFIX by mawalch
mawalch
parents: 5368
diff changeset
  6154
            ].
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6155
            nodeVal notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6156
                ^ { nodeVal . #instanceVariable }
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6157
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6158
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6159
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6160
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6161
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6162
    "Created: / 01-05-2016 / 12:40:05 / cg"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6163
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6164
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6165
valueOfNode:aNode
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6166
    "when showing possible completions for a message,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6167
     it is a good idea to know what the reveiver's value is.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6168
     Sigh - returns nil both if unknown AND if a real nil is there."
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6169
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6170
    |nodeSelector nodeReceiver receiverValue arg1Value|
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6171
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6172
    aNode isLiteral ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6173
        ^ aNode value
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6174
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6175
    aNode isVariable ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6176
        ^ self valueOfVariable:aNode name.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6177
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6178
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6179
    aNode isMessage ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6180
        nodeSelector := aNode selector.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6181
        nodeReceiver := aNode receiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6182
                
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6183
        "/ some hardwired knowledge here
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6184
        classOrNil notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6185
            (nodeReceiver isSelf and:[nodeSelector = #'class']) ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6186
                ^ classOrNil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6187
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6188
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6189
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6190
        receiverValue := self valueOfNode:nodeReceiver.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6191
        receiverValue notNil ifTrue:[
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6192
            (self isNonDestructive:aNode whenSentTo:receiverValue) ifTrue:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6193
                [
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6194
                     nodeSelector argumentCount == 1 ifTrue:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6195
                        arg1Value := self valueOfNode:(aNode arg1).
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6196
                        ^ receiverValue perform: nodeSelector with: arg1Value.
5368
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6197
                    ].    
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6198
                    ^ receiverValue perform: nodeSelector.
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6199
                ] on:Error do:[
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6200
                    ^ nil
1b5ca0f20be5 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5360
diff changeset
  6201
                ]    
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6202
            ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6203
        ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6204
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6205
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6206
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6207
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6208
    "Created: / 28-08-2013 / 16:34:53 / cg"
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6209
!
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6210
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6211
valueOfVariable:aVariableName
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6212
    "when showing possible completions for a variable,
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6213
     it is a good idea to know what the reveiver's value is.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6214
     Sigh - returns nil both if unknown AND if a real nil is there."
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6215
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6216
    |valueAndKind|
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6217
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6218
    (valueAndKind := self valueAndKindOfVariable:aVariableName) notNil ifTrue:[
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6219
        self assert:valueAndKind isArray.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6220
        ^ valueAndKind first.
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6221
    ].
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6222
    ^ nil
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6223
5225
8bcca5a042c5 #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 5224
diff changeset
  6224
    "Modified: / 26-08-2016 / 14:16:16 / cg"
5109
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6225
! !
18c01df208c2 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 5106
diff changeset
  6226
3854
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6227
!DoWhatIMeanSupport::InputCompletionResult class methodsFor:'instance creation'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6228
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6229
bestName:bestNameArg matchingNames:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6230
    ^ self with:bestNameArg with:matchingNamesArg
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6231
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6232
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6233
     self bestName:123 matchingNames:345
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6234
    "
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6235
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6236
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6237
!DoWhatIMeanSupport::InputCompletionResult methodsFor:'accessing'!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6238
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6239
bestName
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6240
    ^ self at:1
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6241
!
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6242
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6243
matchingNames
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6244
    ^ self at:2
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6245
! !
d7904ce12bb6 changed: #classnameCompletion:filter:inEnvironment:
Claus Gittinger <cg@exept.de>
parents: 3853
diff changeset
  6246
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6247
!DoWhatIMeanSupport class methodsFor:'documentation'!
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6248
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6249
version
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  6250
    ^ '$Header$'
4281
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6251
!
05f2bc8ee7e4 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4280
diff changeset
  6252
3761
6584390d427d dont forget pool variables when looking for the best variable match
Claus Gittinger <cg@exept.de>
parents: 3751
diff changeset
  6253
version_CVS
4784
7c4d1f1a6b30 class: DoWhatIMeanSupport
Claus Gittinger <cg@exept.de>
parents: 4780
diff changeset
  6254
    ^ '$Header$'
4830
d4cd05d0d643 Removed breakpoint in DWIM - likely won;'t be fixed
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4823
diff changeset
  6255
!
d4cd05d0d643 Removed breakpoint in DWIM - likely won;'t be fixed
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4823
diff changeset
  6256
d4cd05d0d643 Removed breakpoint in DWIM - likely won;'t be fixed
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4823
diff changeset
  6257
version_HG
d4cd05d0d643 Removed breakpoint in DWIM - likely won;'t be fixed
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4823
diff changeset
  6258
d4cd05d0d643 Removed breakpoint in DWIM - likely won;'t be fixed
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4823
diff changeset
  6259
    ^ '$Changeset: <not expanded> $'
2376
41e0228c4c58 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  6260
! !
4194
e677aae984be Refactoring:
Stefan Vogel <sv@exept.de>
parents: 4148
diff changeset
  6261