[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Help-smalltalk] [PATCH 2/2] tooling: Introduce a helper for a Monticell
From: |
Holger Hans Peter Freyther |
Subject: |
[Help-smalltalk] [PATCH 2/2] tooling: Introduce a helper for a Monticello export |
Date: |
Sun, 5 May 2013 11:25:14 +0200 |
The category of classes and extensions should match the package
name. Create a small class that is checking this on a package and
print the errors.
2013-03-30 Holger Hans Peter Freyther <address@hidden>
* Lint/Monticello.st: Added Monticello class for linting.
* Parser/SourceClass.st: Reimplement >>#isSourceClass, >>#methodsToEmit,
>>#classMethodsToEmit, #>>isComplete.
* Parser/SourceEntity.st: Added >>#isSourceClass.
* Parser/Loader.st: Add >>#stuffToEmit selector.
* TODO: Add work item.
* package.xml: Add the Lint/Monticello.st.
---
packages/tooling/ChangeLog | 10 ++
packages/tooling/Lint/Monticello.st | 159 +++++++++++++++++++++++++++++++
packages/tooling/Makefile.frag | 2 +-
packages/tooling/Parser/Loader.st | 5 +
packages/tooling/Parser/SourceClass.st | 20 ++++
packages/tooling/Parser/SourceEntity.st | 4 +
packages/tooling/TODO | 11 +++
packages/tooling/package.xml | 2 +
8 files changed, 212 insertions(+), 1 deletion(-)
create mode 100644 packages/tooling/Lint/Monticello.st
diff --git a/packages/tooling/ChangeLog b/packages/tooling/ChangeLog
index d5d2a47..65b30a1 100644
--- a/packages/tooling/ChangeLog
+++ b/packages/tooling/ChangeLog
@@ -1,5 +1,15 @@
2013-03-30 Holger Hans Peter Freyther <address@hidden>
+ * Lint/Monticello.st: Added Monticello class for linting.
+ * Parser/SourceClass.st: Reimplement >>#isSourceClass, >>#methodsToEmit,
+ >>#classMethodsToEmit, #>>isComplete.
+ * Parser/SourceEntity.st: Added >>#isSourceClass.
+ * Parser/Loader.st: Add >>#stuffToEmit selector.
+ * TODO: Add work item.
+ * package.xml: Add the Lint/Monticello.st.
+
+2013-03-30 Holger Hans Peter Freyther <address@hidden>
+
* Makefile.frag: Added.
* Parser/SourceClass.st: Added from scripts/Convert.st.
* Parser/SourceComments.st: Added from scripts/Convert.st.
diff --git a/packages/tooling/Lint/Monticello.st
b/packages/tooling/Lint/Monticello.st
new file mode 100644
index 0000000..5bd2998
--- /dev/null
+++ b/packages/tooling/Lint/Monticello.st
@@ -0,0 +1,159 @@
+"======================================================================
+|
+| Linting for Monticello export
+|
+|
+ ======================================================================"
+
+"======================================================================
+|
+| Copyright 2013 Free Software Foundation, Inc.
+| Written by Holger Hans Peter Freyther.
+|
+| This file is part of the GNU Smalltalk class library.
+|
+| The GNU Smalltalk class library is free software; you can redistribute it
+| and/or modify it under the terms of the GNU Lesser General Public License
+| as published by the Free Software Foundation; either version 2.1, or (at
+| your option) any later version.
+|
+| The GNU Smalltalk class library is distributed in the hope that it will be
+| useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+| General Public License for more details.
+|
+| You should have received a copy of the GNU Lesser General Public License
+| along with the GNU Smalltalk class library; see the file COPYING.LIB.
+| If not, write to the Free Software Foundation, 59 Temple Place - Suite
+| 330, Boston, MA 02110-1301, USA.
+|
+ ======================================================================"
+
+
+Tooling.SourceClass extend [
+ isComplete [
+ <category: 'accessing'>
+ ^ isComplete
+ ]
+
+ methodsToEmit [
+ <category: 'accessing'>
+ ^ methodsToEmit
+ ]
+
+ classMethodsToEmit [
+ <category: 'accessing'>
+ ^ classMethodsToEmit
+ ]
+
+ isComplete [
+ <category: 'accessing'>
+ ^ isComplete
+ ]
+]
+
+Object subclass: Monticello [
+ | loader package errors |
+ <category: 'Tooling-Lint-Monticello'>
+
+ Monticello class >> lint: aPackage [
+ "Work on a given package."
+ ^ self new
+ loadPackage: aPackage;
+ lint.
+ ]
+
+ loadPackage: aPackage [
+ package := aPackage.
+ loader := Tooling.Loader new.
+
+ self lintFiles: aPackage fileIns.
+ aPackage test ifNotNil: [
+ self lintFiles: aPackage test fileIns].
+ ]
+
+ lintFiles: aList [
+ | files |
+
+ files := package fullPathsOf: aList.
+ files do: [:each | | file |
+ file := each open: FileStream read.
+ loader parseSmalltalkStream: file with: STInST.GSTFileInParser.
+ file close.
+ ]
+ ]
+
+ loader [
+ <category: 'private'>
+ ^ loader
+ ]
+
+ lint [
+ <category: 'lint'>
+ "TODO: this should use the visitor..."
+ loader stuffToEmit do: [:each |
+ each isSourceClass ifTrue: [self lintClass: each]].
+ ]
+
+ lintClass: aClass [
+ <category: 'lint'>
+ aClass isComplete
+ ifTrue: [self lintCompleteClass: aClass]
+ ifFalse: [self lintExtension: aClass].
+ ]
+
+ lintCompleteClass: aClass [
+ <category: 'lint'>
+ "Check if the package name is in the category"
+ (aClass forClass category isNil)
+ ifTrue: [^self addError: 'Class does not have category'
+ for: aClass forClass].
+ (aClass forClass category startsWith: package name)
+ ifFalse: [self addError: 'Class category does not begin with
package name'
+ for: aClass forClass].
+ ]
+
+ lintExtension: aClass [
+ <category: 'lint'>
+
+ aClass methodsToEmit do: [:each |
+ self lintExtensionMethod: each on: aClass].
+ aClass classMethodsToEmit do: [:each |
+ self lintExtensionMethod: each on: aClass ].
+ ]
+
+ lintExtensionMethod: aSymbol on: aClass [
+ | method |
+ <category: 'lint'>
+ method := aClass forClass >> aSymbol.
+
+ "Use aClass forClass asClass as ProxyClass>>#name will return nil"
+ (method methodCategory isNil)
+ ifTrue: [^self addError: 'Extension method needs category'
+ for: aClass forClass asClass method: aSymbol].
+ (method methodCategory asLowercase startsWith: ('*', package name
asLowercase))
+ ifFalse: [self addError: 'Method does not beging with
*package-name'
+ for: aClass forClass asClass method: aSymbol].
+ ]
+
+ addError: aString for: aClass method: aMethod [
+ <category: 'error-handling'>
+ self errors add: '%1 on %2>>%3' % {aString. aClass name asString.
aMethod}.
+ ]
+
+ addError: aString for: aClass [
+ <category: 'error-handling'>
+ self errors add: '%1 on %2' % {aString. aClass name asString}.
+ ]
+
+ errors [
+ <category: 'error-handling'>
+ ^ errors ifNil: [errors := OrderedCollection new].
+ ]
+
+ printErrors [
+ <category: 'error-handling'>
+ self errors do: [:each |
+ Transcript nextPutAll: each; nl.]
+ ]
+]
diff --git a/packages/tooling/Makefile.frag b/packages/tooling/Makefile.frag
index bb2a845..833b5a7 100644
--- a/packages/tooling/Makefile.frag
+++ b/packages/tooling/Makefile.frag
@@ -1,5 +1,5 @@
Tooling_FILES = \
-packages/tooling/Parser/SourceEntity.st packages/tooling/Parser/SourceClass.st
packages/tooling/Parser/SourceComments.st packages/tooling/Parser/SourceEval.st
packages/tooling/Parser/Loader.st
+packages/tooling/Parser/SourceEntity.st packages/tooling/Parser/SourceClass.st
packages/tooling/Parser/SourceComments.st packages/tooling/Parser/SourceEval.st
packages/tooling/Parser/Loader.st packages/tooling/Lint/Monticello.st
$(Tooling_FILES):
$(srcdir)/packages/tooling/stamp-classes: $(Tooling_FILES)
touch $(srcdir)/packages/tooling/stamp-classes
diff --git a/packages/tooling/Parser/Loader.st
b/packages/tooling/Parser/Loader.st
index 0c4e6a9..887e62b 100644
--- a/packages/tooling/Parser/Loader.st
+++ b/packages/tooling/Parser/Loader.st
@@ -232,4 +232,9 @@ STInST.STClassLoader subclass: Loader [
ifTrue: [ stuffToEmit last addMethod: aMethod ]
ifFalse: [ stuffToEmit add: ((SourceClass forExtension:
currentClass) addMethod: aMethod) ]
]
+
+ stuffToEmit [
+ <category: 'accessing'>
+ ^ stuffToEmit
+ ]
]
diff --git a/packages/tooling/Parser/SourceClass.st
b/packages/tooling/Parser/SourceClass.st
index 4258356..776bcec 100644
--- a/packages/tooling/Parser/SourceClass.st
+++ b/packages/tooling/Parser/SourceClass.st
@@ -82,4 +82,24 @@ SourceEntity subclass: SourceClass [
completeFileOut: isComplete;
fileOutSelectors: methodsToEmit classSelectors: classMethodsToEmit.
]
+
+ isSourceClass [
+ <category: 'accessing'>
+ ^ true
+ ]
+
+ methodsToEmit [
+ <category: 'accessing'>
+ ^ methodsToEmit
+ ]
+
+ classMethodsToEmit [
+ <category: 'accessing'>
+ ^ classMethodsToEmit
+ ]
+
+ isComplete [
+ <category: 'accessing'>
+ ^ isComplete
+ ]
]
diff --git a/packages/tooling/Parser/SourceEntity.st
b/packages/tooling/Parser/SourceEntity.st
index bbee944..c6c735c 100644
--- a/packages/tooling/Parser/SourceEntity.st
+++ b/packages/tooling/Parser/SourceEntity.st
@@ -36,4 +36,8 @@ Object subclass: SourceEntity [
emitTo: aStream filteredBy: aBlock [
self subclassResponsibility
]
+
+ isSourceClass [
+ ^ false
+ ]
]
diff --git a/packages/tooling/TODO b/packages/tooling/TODO
index b1617dc..4014c0b 100644
--- a/packages/tooling/TODO
+++ b/packages/tooling/TODO
@@ -2,3 +2,14 @@
of the calls to emitTo:.
* Remove "Emit" from variable names.
+
+* The following is shown as a a single class
+ Object subclass: Foo [
+ signal []
+ ]
+
+ Foo extend [
+ signalTwo []
+ ]
+
+ It should be two SourceClass
diff --git a/packages/tooling/package.xml b/packages/tooling/package.xml
index f5b99d5..8359efe 100644
--- a/packages/tooling/package.xml
+++ b/packages/tooling/package.xml
@@ -8,4 +8,6 @@
<filein>Parser/SourceComments.st</filein>
<filein>Parser/SourceEval.st</filein>
<filein>Parser/Loader.st</filein>
+
+ <filein>Lint/Monticello.st</filein>
</package>
--
1.7.10.4
Re: [Help-smalltalk] [PATCH 1/2] tooling: Introduce a new package for tooling helpers, Paolo Bonzini, 2013/05/11