Changeset 798:600e0e0c759d in livinglogic.java.ul4

Show
Ignore:
Timestamp:
02/18/13 15:31:19 (6 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Added methods append, insert, pop and update.

Added support for * and ** arguments to Signature.

Location:
src
Files:
4 added
4 modified

Legend:

Unmodified
Added
Removed
  • src/main/java/com/livinglogic/ul4/CallMeth.java

    r797 r798  
    7575            "witha", new MethodWithA(), 
    7676            "join", new MethodJoin(), 
    77             "replace", new MethodReplace() 
     77            "replace", new MethodReplace(), 
     78            "append", new MethodAppend(), 
     79            "insert", new MethodInsert(), 
     80            "pop", new MethodPop(), 
     81            "update", new MethodUpdate() 
    7882        ); 
    7983    } 
  • src/main/java/com/livinglogic/ul4/Signature.java

    r784 r798  
    1010import java.util.LinkedHashMap; 
    1111import java.util.Iterator; 
     12import java.util.ArrayList; 
     13import static java.util.Arrays.asList; 
    1214 
    1315public class Signature implements Iterable<ArgumentDescription> 
    1416{ 
    1517    protected String name; 
    16     protected Map<String, ArgumentDescription> arguments; 
     18    protected LinkedHashMap<String, ArgumentDescription> arguments; 
     19    protected String remainingArguments; 
     20    protected String remainingKeywordArguments; 
     21 
     22    public Signature(String name, String remainingArguments, String remainingKeywordArguments) 
     23    { 
     24        this.name = name; 
     25        arguments = new LinkedHashMap<String, ArgumentDescription>(); 
     26        this.remainingArguments = remainingArguments; 
     27        this.remainingKeywordArguments = remainingKeywordArguments; 
     28    } 
    1729 
    1830    public Signature(String name) 
    1931    { 
    20         this.name = name; 
    21         arguments = new LinkedHashMap<String, ArgumentDescription>(); 
     32        this(name, null, null); 
    2233    } 
    2334 
     
    3546    { 
    3647        arguments.put(name, new ArgumentDescription(name, arguments.size(), defaultValue)); 
     48    } 
     49 
     50    public void setRemainingArguments(String remainingArguments) 
     51    { 
     52        this.remainingArguments = remainingArguments; 
     53    } 
     54 
     55    public void setRemainingKeywordArguments(String remainingKeywordArguments) 
     56    { 
     57        this.remainingKeywordArguments = remainingKeywordArguments; 
    3758    } 
    3859 
     
    5475    public Object[] makeArgumentArray(Object[] args, Map<String, Object> kwargs) 
    5576    { 
    56         Object[] realargs = new Object[size()]; 
     77        int realSize = size(); 
     78        int remainingArgumentsPos = -1; 
     79        int remainingKeywordArgumentsPos = -1; 
     80        if (remainingArguments != null) 
     81            remainingArgumentsPos = realSize++; 
     82        if (remainingKeywordArguments != null) 
     83            remainingKeywordArgumentsPos = realSize++; 
     84 
     85        Object[] realargs = new Object[realSize]; 
    5786 
    5887        int i = 0; 
     
    83112        } 
    84113 
    85         // Check that we don't have any keyword arguments that we don't support 
    86         for (String kwargname : kwargs.keySet()) 
     114        // Handle additional positional arguments 
     115        // if there are any, and we suport a "*" argument, put the remaining arguments into this argument as a list, else complain 
     116        int expectedArgCount = size(); 
     117        if (remainingArguments != null) 
    87118        { 
    88             if (!containsArgumentNamed(kwargname)) 
    89                 throw new UnsupportedArgumentNameException(this, kwargname); 
     119            realargs[remainingArgumentsPos] = (args.length > expectedArgCount) ? asList(args).subList(arguments.size(), args.length) : new ArrayList<Object>(); 
     120        } 
     121        else 
     122        { 
     123            if (args.length > expectedArgCount) 
     124                throw new TooManyArgumentsException(this, args.length); 
    90125        } 
    91126 
    92         // Check that we don't have more positional arguments than expected 
    93         int expectedArgCount = size(); 
    94         if (args.length > expectedArgCount) 
    95             throw new TooManyArgumentsException(this, args.length); 
     127        // Handle additional keyword arguments 
     128        // if there are any, and we suport a "**" argument, put the remaining keyword arguments into this argument as a map, else complain 
     129        if (remainingKeywordArguments != null) 
     130        { 
     131            LinkedHashMap<String, Object> realRemainingKeywordArguments = new LinkedHashMap<String, Object>(); 
     132            for (String kwargname : kwargs.keySet()) 
     133            { 
     134                if (!containsArgumentNamed(kwargname)) 
     135                { 
     136                    realRemainingKeywordArguments.put(kwargname, kwargs.get(kwargname)); 
     137                } 
     138            } 
     139            realargs[remainingKeywordArgumentsPos] = realRemainingKeywordArguments; 
     140        } 
     141        else 
     142        { 
     143            for (String kwargname : kwargs.keySet()) 
     144            { 
     145                if (!containsArgumentNamed(kwargname)) 
     146                    throw new UnsupportedArgumentNameException(this, kwargname); 
     147            } 
     148        } 
    96149 
    97150        return realargs; 
  • src/main/resources/versiondoc.txt

    r784 r798  
    44* Implemented UL4 functions. 
    55* Removed builtin UL4 functions vars and get. 
     6* Added methods append, insert, pop and update. 
    67* Removed JavaSource4Template and JavascriptSource4Template (as this was 
    78  basically just a call to dumps() anyway). 
  • src/test/java/tests/UL4Test.java

    r796 r798  
    30803080        checkTemplateOutput("132", "<?print d.yearday()?>", "d", FunctionDate.call(2010, 5, 12)); 
    30813081        checkTemplateOutput("132", "<?print d.yearday()?>", "d", FunctionDate.call(2010, 5, 12, 16, 47, 56)); 
     3082    } 
     3083 
     3084    @Test 
     3085    public void method_append() 
     3086    { 
     3087        checkTemplateOutput("[17, 23, 42]", "<?code l = [17]?><?code l.append(23, 42)?><?print l?>"); 
     3088    } 
     3089 
     3090    @Test 
     3091    public void method_insert() 
     3092    { 
     3093        checkTemplateOutput("[1, 2, 3, 4]", "<?code l = [1,4]?><?code l.insert(1, 2, 3)?><?print l?>"); 
     3094    } 
     3095 
     3096    @Test 
     3097    public void method_pop() 
     3098    { 
     3099        checkTemplateOutput("42;17;23;", "<?code l = [17, 23, 42]?><?print l.pop()?>;<?print l.pop(-2)?>;<?print l.pop(0)?>;"); 
     3100    } 
     3101 
     3102    @Test 
     3103    public void method_update() 
     3104    { 
     3105        checkTemplateOutput("0", "<?code d = {}?><?code d.update()?><?print len(d)?>"); 
     3106        checkTemplateOutput("1", "<?code d = {}?><?code d.update([['one', 1]])?><?print d.one?>"); 
     3107        checkTemplateOutput("1", "<?code d = {}?><?code d.update({'one': 1})?><?print d.one?>"); 
     3108        checkTemplateOutput("1", "<?code d = {}?><?code d.update(one=1)?><?print d.one?>"); 
     3109        checkTemplateOutput("1", "<?code d = {}?><?code d.update([['one', 0]], {'one': 0}, one=1)?><?print d.one?>"); 
    30823110    } 
    30833111