Kaydet (Commit) 6935acb0 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Replace "known-good" dynamic_casts with static_casts

...it avoids false warnings about unchecked dynamic_cast results from static
code analyzers, and potentially makes the code a little faster, too.  (Most of
these dynamic_casts were kind of a leftover from a very early design that
dispateched on Node type via dynamic_cast instead of a Node::Kind, but which was
much too slow.)

Change-Id: I8db08a1c35783f8ea6c51eed55b11faa2d958807
üst a0e4c24e
...@@ -135,7 +135,7 @@ void Access::markChildAsModified(rtl::Reference< ChildAccess > const & child) { ...@@ -135,7 +135,7 @@ void Access::markChildAsModified(rtl::Reference< ChildAccess > const & child) {
parent->modifiedChildren_.insert( parent->modifiedChildren_.insert(
ModifiedChildren::value_type( ModifiedChildren::value_type(
p->getNameInternal(), p->getNameInternal(),
ModifiedChild(dynamic_cast< ChildAccess * >(p.get()), false))); ModifiedChild(static_cast< ChildAccess * >(p.get()), false)));
p = parent; p = parent;
} }
} }
...@@ -185,7 +185,7 @@ css::uno::Sequence< css::uno::Type > Access::getTypes() ...@@ -185,7 +185,7 @@ css::uno::Sequence< css::uno::Type > Access::getTypes()
types.push_back( types.push_back(
cppu::UnoType< css::container::XHierarchicalNameReplace >::get()); cppu::UnoType< css::container::XHierarchicalNameReplace >::get());
if (getNode()->kind() != Node::KIND_GROUP || if (getNode()->kind() != Node::KIND_GROUP ||
dynamic_cast< GroupNode * >(getNode().get())->isExtensible()) static_cast< GroupNode * >(getNode().get())->isExtensible())
{ {
types.push_back( types.push_back(
cppu::UnoType< css::container::XNameContainer >::get()); cppu::UnoType< css::container::XNameContainer >::get());
...@@ -322,7 +322,7 @@ css::uno::Type Access::getElementType() throw (css::uno::RuntimeException) { ...@@ -322,7 +322,7 @@ css::uno::Type Access::getElementType() throw (css::uno::RuntimeException) {
switch (p->kind()) { switch (p->kind()) {
case Node::KIND_LOCALIZED_PROPERTY: case Node::KIND_LOCALIZED_PROPERTY:
return mapType( return mapType(
dynamic_cast< LocalizedPropertyNode * >(p.get())->getStaticType()); static_cast< LocalizedPropertyNode * >(p.get())->getStaticType());
case Node::KIND_GROUP: case Node::KIND_GROUP:
//TODO: Should a specific type be returned for a non-extensible group //TODO: Should a specific type be returned for a non-extensible group
// with homogeneous members or for an extensible group that currently // with homogeneous members or for an extensible group that currently
...@@ -614,7 +614,7 @@ void Access::setName(OUString const & aName) ...@@ -614,7 +614,7 @@ void Access::setName(OUString const & aName)
{ {
rtl::Reference< RootAccess > root(getRootAccess()); rtl::Reference< RootAccess > root(getRootAccess());
rtl::Reference< ChildAccess > childAccess( rtl::Reference< ChildAccess > childAccess(
dynamic_cast< ChildAccess * >(this)); static_cast< ChildAccess * >(this));
localMods.add(getRelativePath()); localMods.add(getRelativePath());
// unbind() modifies the parent chain that // unbind() modifies the parent chain that
// markChildAsModified() walks, so order is // markChildAsModified() walks, so order is
...@@ -1179,7 +1179,7 @@ void Access::removeByName(OUString const & aName) ...@@ -1179,7 +1179,7 @@ void Access::removeByName(OUString const & aName)
if (getNode()->kind() == Node::KIND_GROUP) { if (getNode()->kind() == Node::KIND_GROUP) {
rtl::Reference< Node > p(child->getNode()); rtl::Reference< Node > p(child->getNode());
if (p->kind() != Node::KIND_PROPERTY || if (p->kind() != Node::KIND_PROPERTY ||
!dynamic_cast< PropertyNode * >(p.get())->isExtension()) !static_cast< PropertyNode * >(p.get())->isExtension())
{ {
throw css::container::NoSuchElementException( throw css::container::NoSuchElementException(
aName, static_cast< cppu::OWeakObject * >(this)); aName, static_cast< cppu::OWeakObject * >(this));
...@@ -1201,7 +1201,7 @@ css::uno::Reference< css::uno::XInterface > Access::createInstance() ...@@ -1201,7 +1201,7 @@ css::uno::Reference< css::uno::XInterface > Access::createInstance()
{ {
assert(thisIs(IS_SET|IS_UPDATE)); assert(thisIs(IS_SET|IS_UPDATE));
OUString tmplName( OUString tmplName(
dynamic_cast< SetNode * >(getNode().get())->getDefaultTemplateName()); static_cast< SetNode * >(getNode().get())->getDefaultTemplateName());
rtl::Reference< Node > tmpl( rtl::Reference< Node > tmpl(
components_.getTemplate(Data::NO_LAYER, tmplName)); components_.getTemplate(Data::NO_LAYER, tmplName));
if (!tmpl.is()) { if (!tmpl.is()) {
...@@ -1355,7 +1355,7 @@ css::uno::Any Access::queryInterface(css::uno::Type const & aType) ...@@ -1355,7 +1355,7 @@ css::uno::Any Access::queryInterface(css::uno::Type const & aType)
return res; return res;
} }
if (getNode()->kind() != Node::KIND_GROUP || if (getNode()->kind() != Node::KIND_GROUP ||
dynamic_cast< GroupNode * >(getNode().get())->isExtensible()) static_cast< GroupNode * >(getNode().get())->isExtensible())
{ {
res = cppu::queryInterface( res = cppu::queryInterface(
aType, static_cast< css::container::XNameContainer * >(this)); aType, static_cast< css::container::XNameContainer * >(this));
...@@ -1534,7 +1534,7 @@ void Access::insertLocalizedValueChild( ...@@ -1534,7 +1534,7 @@ void Access::insertLocalizedValueChild(
Modifications * localModifications) Modifications * localModifications)
{ {
assert(localModifications != 0); assert(localModifications != 0);
LocalizedPropertyNode * locprop = dynamic_cast< LocalizedPropertyNode * >( LocalizedPropertyNode * locprop = static_cast< LocalizedPropertyNode * >(
getNode().get()); getNode().get());
checkValue(value, locprop->getStaticType(), locprop->isNillable()); checkValue(value, locprop->getStaticType(), locprop->isNillable());
rtl::Reference< ChildAccess > child( rtl::Reference< ChildAccess > child(
...@@ -2075,7 +2075,7 @@ rtl::Reference< ChildAccess > Access::getSubChild(OUString const & path) { ...@@ -2075,7 +2075,7 @@ rtl::Reference< ChildAccess > Access::getSubChild(OUString const & path) {
break; break;
case Node::KIND_SET: case Node::KIND_SET:
if (!templateName.isEmpty() && if (!templateName.isEmpty() &&
!dynamic_cast< SetNode * >(p.get())->isValidTemplate( !static_cast< SetNode * >(p.get())->isValidTemplate(
templateName)) templateName))
{ {
return rtl::Reference< ChildAccess >(); return rtl::Reference< ChildAccess >();
...@@ -2120,7 +2120,7 @@ css::beans::Property Access::asProperty() { ...@@ -2120,7 +2120,7 @@ css::beans::Property Access::asProperty() {
switch (p->kind()) { switch (p->kind()) {
case Node::KIND_PROPERTY: case Node::KIND_PROPERTY:
{ {
PropertyNode * prop = dynamic_cast< PropertyNode * >(p.get()); PropertyNode * prop = static_cast< PropertyNode * >(p.get());
type = mapType(prop->getStaticType()); type = mapType(prop->getStaticType());
nillable = prop->isNillable(); nillable = prop->isNillable();
removable = prop->isExtension(); removable = prop->isExtension();
...@@ -2129,7 +2129,7 @@ css::beans::Property Access::asProperty() { ...@@ -2129,7 +2129,7 @@ css::beans::Property Access::asProperty() {
case Node::KIND_LOCALIZED_PROPERTY: case Node::KIND_LOCALIZED_PROPERTY:
{ {
LocalizedPropertyNode * locprop = LocalizedPropertyNode * locprop =
dynamic_cast< LocalizedPropertyNode *>(p.get()); static_cast< LocalizedPropertyNode *>(p.get());
if (Components::allLocales(getRootAccess()->getLocale())) { if (Components::allLocales(getRootAccess()->getLocale())) {
type = cppu::UnoType< css::uno::XInterface >::get(); type = cppu::UnoType< css::uno::XInterface >::get();
//TODO: correct? //TODO: correct?
...@@ -2144,7 +2144,7 @@ css::beans::Property Access::asProperty() { ...@@ -2144,7 +2144,7 @@ css::beans::Property Access::asProperty() {
case Node::KIND_LOCALIZED_VALUE: case Node::KIND_LOCALIZED_VALUE:
{ {
LocalizedPropertyNode * locprop = LocalizedPropertyNode * locprop =
dynamic_cast< LocalizedPropertyNode * >(getParentNode().get()); static_cast< LocalizedPropertyNode * >(getParentNode().get());
type = mapType(locprop->getStaticType()); type = mapType(locprop->getStaticType());
nillable = locprop->isNillable(); nillable = locprop->isNillable();
removable = false; //TODO ??? removable = false; //TODO ???
...@@ -2223,7 +2223,7 @@ rtl::Reference< ChildAccess > Access::getFreeSetMember( ...@@ -2223,7 +2223,7 @@ rtl::Reference< ChildAccess > Access::getFreeSetMember(
static_cast< cppu::OWeakObject * >(this), 1); static_cast< cppu::OWeakObject * >(this), 1);
} }
assert(dynamic_cast< SetNode * >(getNode().get()) != 0); assert(dynamic_cast< SetNode * >(getNode().get()) != 0);
if (!dynamic_cast< SetNode * >(getNode().get())->isValidTemplate( if (!static_cast< SetNode * >(getNode().get())->isValidTemplate(
freeAcc->getNode()->getTemplateName())) freeAcc->getNode()->getTemplateName()))
{ {
throw css::lang::IllegalArgumentException( throw css::lang::IllegalArgumentException(
...@@ -2252,7 +2252,7 @@ bool Access::thisIs(int what) { ...@@ -2252,7 +2252,7 @@ bool Access::thisIs(int what) {
((what & IS_GROUP) == 0 || k == Node::KIND_GROUP) && ((what & IS_GROUP) == 0 || k == Node::KIND_GROUP) &&
((what & IS_SET) == 0 || k == Node::KIND_SET) && ((what & IS_SET) == 0 || k == Node::KIND_SET) &&
((what & IS_EXTENSIBLE) == 0 || k != Node::KIND_GROUP || ((what & IS_EXTENSIBLE) == 0 || k != Node::KIND_GROUP ||
dynamic_cast< GroupNode * >(p.get())->isExtensible()) && static_cast< GroupNode * >(p.get())->isExtensible()) &&
((what & IS_GROUP_MEMBER) == 0 || ((what & IS_GROUP_MEMBER) == 0 ||
getParentNode()->kind() == Node::KIND_GROUP)) || getParentNode()->kind() == Node::KIND_GROUP)) ||
((what & IS_SET_MEMBER) == 0 || ((what & IS_SET_MEMBER) == 0 ||
......
...@@ -215,7 +215,7 @@ void ChildAccess::setProperty( ...@@ -215,7 +215,7 @@ void ChildAccess::setProperty(
switch (node_->kind()) { switch (node_->kind()) {
case Node::KIND_PROPERTY: case Node::KIND_PROPERTY:
{ {
PropertyNode * prop = dynamic_cast< PropertyNode * >(node_.get()); PropertyNode * prop = static_cast< PropertyNode * >(node_.get());
type = prop->getStaticType(); type = prop->getStaticType();
nillable = prop->isNillable(); nillable = prop->isNillable();
} }
...@@ -238,7 +238,7 @@ void ChildAccess::setProperty( ...@@ -238,7 +238,7 @@ void ChildAccess::setProperty(
case Node::KIND_LOCALIZED_VALUE: case Node::KIND_LOCALIZED_VALUE:
{ {
LocalizedPropertyNode * locprop = LocalizedPropertyNode * locprop =
dynamic_cast< LocalizedPropertyNode * >(getParentNode().get()); static_cast< LocalizedPropertyNode * >(getParentNode().get());
type = locprop->getStaticType(); type = locprop->getStaticType();
nillable = locprop->isNillable(); nillable = locprop->isNillable();
} }
...@@ -258,7 +258,7 @@ css::uno::Any ChildAccess::asValue() { ...@@ -258,7 +258,7 @@ css::uno::Any ChildAccess::asValue() {
} }
switch (node_->kind()) { switch (node_->kind()) {
case Node::KIND_PROPERTY: case Node::KIND_PROPERTY:
return dynamic_cast< PropertyNode * >(node_.get())->getValue( return static_cast< PropertyNode * >(node_.get())->getValue(
getComponents()); getComponents());
case Node::KIND_LOCALIZED_PROPERTY: case Node::KIND_LOCALIZED_PROPERTY:
{ {
...@@ -272,7 +272,7 @@ css::uno::Any ChildAccess::asValue() { ...@@ -272,7 +272,7 @@ css::uno::Any ChildAccess::asValue() {
} }
break; break;
case Node::KIND_LOCALIZED_VALUE: case Node::KIND_LOCALIZED_VALUE:
return dynamic_cast< LocalizedValueNode * >(node_.get())->getValue(); return static_cast< LocalizedValueNode * >(node_.get())->getValue();
default: default:
break; break;
} }
...@@ -291,11 +291,11 @@ void ChildAccess::commitChanges(bool valid, Modifications * globalModifications) ...@@ -291,11 +291,11 @@ void ChildAccess::commitChanges(bool valid, Modifications * globalModifications)
globalModifications->add(path); globalModifications->add(path);
switch (node_->kind()) { switch (node_->kind()) {
case Node::KIND_PROPERTY: case Node::KIND_PROPERTY:
dynamic_cast< PropertyNode * >(node_.get())->setValue( static_cast< PropertyNode * >(node_.get())->setValue(
Data::NO_LAYER, *changedValue_); Data::NO_LAYER, *changedValue_);
break; break;
case Node::KIND_LOCALIZED_VALUE: case Node::KIND_LOCALIZED_VALUE:
dynamic_cast< LocalizedValueNode * >(node_.get())->setValue( static_cast< LocalizedValueNode * >(node_.get())->setValue(
Data::NO_LAYER, *changedValue_); Data::NO_LAYER, *changedValue_);
break; break;
default: default:
......
...@@ -279,7 +279,7 @@ rtl::Reference< Node > Data::resolvePathRepresentation( ...@@ -279,7 +279,7 @@ rtl::Reference< Node > Data::resolvePathRepresentation(
break; break;
case Node::KIND_SET: case Node::KIND_SET:
if (!templateName.isEmpty() && if (!templateName.isEmpty() &&
!dynamic_cast< SetNode * >(parent.get())->isValidTemplate( !static_cast< SetNode * >(parent.get())->isValidTemplate(
templateName)) templateName))
{ {
throw css::uno::RuntimeException( throw css::uno::RuntimeException(
......
...@@ -389,7 +389,7 @@ bool ValueParser::endElement() { ...@@ -389,7 +389,7 @@ bool ValueParser::endElement() {
} }
switch (node_->kind()) { switch (node_->kind()) {
case Node::KIND_PROPERTY: case Node::KIND_PROPERTY:
dynamic_cast< PropertyNode * >(node_.get())->setValue( static_cast< PropertyNode * >(node_.get())->setValue(
layer_, value); layer_, value);
break; break;
case Node::KIND_LOCALIZED_PROPERTY: case Node::KIND_LOCALIZED_PROPERTY:
...@@ -402,7 +402,7 @@ bool ValueParser::endElement() { ...@@ -402,7 +402,7 @@ bool ValueParser::endElement() {
localizedName_, localizedName_,
new LocalizedValueNode(layer_, value))); new LocalizedValueNode(layer_, value)));
} else { } else {
dynamic_cast< LocalizedValueNode * >(i->second.get())-> static_cast< LocalizedValueNode * >(i->second.get())->
setValue(layer_, value); setValue(layer_, value);
} }
} }
......
...@@ -267,7 +267,7 @@ void writeNode( ...@@ -267,7 +267,7 @@ void writeNode(
switch (node->kind()) { switch (node->kind()) {
case Node::KIND_PROPERTY: case Node::KIND_PROPERTY:
{ {
PropertyNode * prop = dynamic_cast< PropertyNode * >(node.get()); PropertyNode * prop = static_cast< PropertyNode * >(node.get());
writeData_(handle, RTL_CONSTASCII_STRINGPARAM("<prop oor:name=\"")); writeData_(handle, RTL_CONSTASCII_STRINGPARAM("<prop oor:name=\""));
writeAttributeValue(handle, name); writeAttributeValue(handle, name);
writeData_( writeData_(
...@@ -314,10 +314,10 @@ void writeNode( ...@@ -314,10 +314,10 @@ void writeNode(
writeAttributeValue(handle, name); writeAttributeValue(handle, name);
writeData_(handle, RTL_CONSTASCII_STRINGPARAM("\"")); writeData_(handle, RTL_CONSTASCII_STRINGPARAM("\""));
} }
Type type = dynamic_cast< LocalizedPropertyNode * >(parent.get())-> Type type = static_cast< LocalizedPropertyNode * >(parent.get())->
getStaticType(); getStaticType();
css::uno::Any value( css::uno::Any value(
dynamic_cast< LocalizedValueNode * >(node.get())->getValue()); static_cast< LocalizedValueNode * >(node.get())->getValue());
Type dynType = getDynamicType(value); Type dynType = getDynamicType(value);
assert(dynType != TYPE_ERROR); assert(dynType != TYPE_ERROR);
if (type == TYPE_ANY) { if (type == TYPE_ANY) {
...@@ -392,7 +392,7 @@ void writeModifications( ...@@ -392,7 +392,7 @@ void writeModifications(
break; break;
case Node::KIND_GROUP: case Node::KIND_GROUP:
assert( assert(
dynamic_cast< GroupNode * >(parent.get())->isExtensible()); static_cast< GroupNode * >(parent.get())->isExtensible());
writeData_( writeData_(
handle, RTL_CONSTASCII_STRINGPARAM("<prop oor:name=\"")); handle, RTL_CONSTASCII_STRINGPARAM("<prop oor:name=\""));
writeAttributeValue(handle, nodeName); writeAttributeValue(handle, nodeName);
......
...@@ -74,7 +74,7 @@ void merge( ...@@ -74,7 +74,7 @@ void merge(
NodeMap::iterator i1(members.find(i2->first)); NodeMap::iterator i1(members.find(i2->first));
if (i1 == members.end()) { if (i1 == members.end()) {
if (i2->second->kind() == Node::KIND_PROPERTY && if (i2->second->kind() == Node::KIND_PROPERTY &&
dynamic_cast< GroupNode * >( static_cast< GroupNode * >(
original.get())->isExtensible()) original.get())->isExtensible())
{ {
members.insert(*i2); members.insert(*i2);
...@@ -91,7 +91,7 @@ void merge( ...@@ -91,7 +91,7 @@ void merge(
NodeMap & members = original->getMembers(); NodeMap & members = original->getMembers();
NodeMap::iterator i1(members.find(i2->first)); NodeMap::iterator i1(members.find(i2->first));
if (i1 == members.end()) { if (i1 == members.end()) {
if (dynamic_cast< SetNode * >(original.get())-> if (static_cast< SetNode * >(original.get())->
isValidTemplate(i2->second->getTemplateName())) isValidTemplate(i2->second->getTemplateName()))
{ {
members.insert(*i2); members.insert(*i2);
...@@ -235,7 +235,7 @@ bool XcsParser::startElement( ...@@ -235,7 +235,7 @@ bool XcsParser::startElement(
{ {
handleSetItem( handleSetItem(
reader, reader,
dynamic_cast< SetNode * >(elements_.top().node.get())); static_cast< SetNode * >(elements_.top().node.get()));
return true; return true;
} }
break; break;
......
...@@ -112,7 +112,7 @@ bool XcuParser::startElement( ...@@ -112,7 +112,7 @@ bool XcuParser::startElement(
{ {
handlePropValue( handlePropValue(
reader, reader,
dynamic_cast< PropertyNode * >(state_.top().node.get())); static_cast< PropertyNode * >(state_.top().node.get()));
} else { } else {
throw css::uno::RuntimeException( throw css::uno::RuntimeException(
("bad property node member <" + name.convertFromUtf8() + ("bad property node member <" + name.convertFromUtf8() +
...@@ -126,7 +126,7 @@ bool XcuParser::startElement( ...@@ -126,7 +126,7 @@ bool XcuParser::startElement(
{ {
handleLocpropValue( handleLocpropValue(
reader, reader,
dynamic_cast< LocalizedPropertyNode * >( static_cast< LocalizedPropertyNode * >(
state_.top().node.get())); state_.top().node.get()));
} else { } else {
throw css::uno::RuntimeException( throw css::uno::RuntimeException(
...@@ -146,7 +146,7 @@ bool XcuParser::startElement( ...@@ -146,7 +146,7 @@ bool XcuParser::startElement(
{ {
handleGroupProp( handleGroupProp(
reader, reader,
dynamic_cast< GroupNode * >(state_.top().node.get())); static_cast< GroupNode * >(state_.top().node.get()));
} else if (nsId == xmlreader::XmlReader::NAMESPACE_NONE && } else if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name.equals("node")) name.equals("node"))
{ {
...@@ -163,7 +163,7 @@ bool XcuParser::startElement( ...@@ -163,7 +163,7 @@ bool XcuParser::startElement(
name.equals("node")) name.equals("node"))
{ {
handleSetNode( handleSetNode(
reader, dynamic_cast< SetNode * >(state_.top().node.get())); reader, static_cast< SetNode * >(state_.top().node.get()));
} else if (nsId == xmlreader::XmlReader::NAMESPACE_NONE && } else if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name.equals("prop")) name.equals("prop"))
{ {
...@@ -383,7 +383,7 @@ void XcuParser::handleItem(xmlreader::XmlReader & reader) { ...@@ -383,7 +383,7 @@ void XcuParser::handleItem(xmlreader::XmlReader & reader) {
state_.push(State::Ignore(true)); state_.push(State::Ignore(true));
return; return;
case Node::KIND_LOCALIZED_PROPERTY: case Node::KIND_LOCALIZED_PROPERTY:
valueParser_.type_ = dynamic_cast< LocalizedPropertyNode * >( valueParser_.type_ = static_cast< LocalizedPropertyNode * >(
node.get())->getStaticType(); node.get())->getStaticType();
break; break;
default: default:
...@@ -542,7 +542,7 @@ void XcuParser::handleLocpropValue( ...@@ -542,7 +542,7 @@ void XcuParser::handleLocpropValue(
members[name] = new LocalizedValueNode( members[name] = new LocalizedValueNode(
valueParser_.getLayer(), css::uno::Any()); valueParser_.getLayer(), css::uno::Any());
} else { } else {
dynamic_cast< LocalizedValueNode * >( static_cast< LocalizedValueNode * >(
i->second.get())->setValue( i->second.get())->setValue(
valueParser_.getLayer(), css::uno::Any()); valueParser_.getLayer(), css::uno::Any());
} }
...@@ -635,7 +635,7 @@ void XcuParser::handleGroupProp( ...@@ -635,7 +635,7 @@ void XcuParser::handleGroupProp(
case Node::KIND_LOCALIZED_PROPERTY: case Node::KIND_LOCALIZED_PROPERTY:
handleLocalizedGroupProp( handleLocalizedGroupProp(
reader, reader,
dynamic_cast< LocalizedPropertyNode * >(i->second.get()), name, static_cast< LocalizedPropertyNode * >(i->second.get()), name,
type, op, finalized); type, op, finalized);
break; break;
default: default:
...@@ -688,7 +688,7 @@ void XcuParser::handlePlainGroupProp( ...@@ -688,7 +688,7 @@ void XcuParser::handlePlainGroupProp(
NodeMap::iterator const & propertyIndex, OUString const & name, NodeMap::iterator const & propertyIndex, OUString const & name,
Type type, Operation operation, bool finalized) Type type, Operation operation, bool finalized)
{ {
PropertyNode * property = dynamic_cast< PropertyNode * >( PropertyNode * property = static_cast< PropertyNode * >(
propertyIndex->second.get()); propertyIndex->second.get());
if (property->getLayer() > valueParser_.getLayer()) { if (property->getLayer() > valueParser_.getLayer()) {
state_.push(State::Ignore(true)); state_.push(State::Ignore(true));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment