help-smalltalk
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]